Added a small bit of code to support the SNOM 360's Record button. Made the find_feat...
authorSteve Murphy <murf@digium.com>
Fri, 4 May 2007 16:37:23 +0000 (16:37 +0000)
committerSteve Murphy <murf@digium.com>
Fri, 4 May 2007 16:37:23 +0000 (16:37 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@63046 65c4cc65-6c06-0410-ace0-fbb531ad65f3

UPGRADE.txt
channels/chan_sip.c
include/asterisk/features.h
res/res_features.c

index 2b7faf0..3cd4c2d 100644 (file)
@@ -61,3 +61,14 @@ Formats:
   choppiness or the clipping of loud signal peaks.  To increasing the volume
   of voicemail messages, use the 'volgain' option in voicemail.conf
 
+Channel Drivers:
+
+* chan_sip.c: a small upgrade to support the "Record" button on the SNOM360,
+  which sends a sip INFO message with a "Record: on" or "Record: off" 
+  header. If asterisk is set up (via features.conf) to accept "One Touch Monitor"
+  requests (by default, via '*1'), then the user-configured dialpad sequence
+  is generated, and recording can be started and stopped via this button. The
+  file names and formats are all controlled via the normal mechanisms. If the
+  user has not configured the automon feature, the normal "415 Unsupported media type"
+  is returned, and nothing is done.
+
index db1b063..9199128 100644 (file)
@@ -11645,6 +11645,38 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
                        transmit_response(p, "403 Unauthorized", req);
                }
                return;
+       } else if (!ast_strlen_zero(c = get_header(req, "Record"))) {
+               /* first, get the feature string, if it exists */
+               struct ast_call_feature *feat = find_feature("automon");
+               
+               if (!feat || ast_strlen_zero(feat->exten)) {
+                       ast_log(LOG_WARNING,"Recording requested, but no One Touch Monitor registered. (See features.conf)\n");
+                       transmit_response(p, "415 Unsupported media type", req);
+                       return;
+               } else {
+                       int j;
+                       struct ast_frame f = { AST_FRAME_DTMF, };
+                       f.len = 100;
+                       for (j=0; j<strlen(feat->exten); j++) {
+                               f.subclass = feat->exten[j];
+                               ast_queue_frame(p->owner, &f);
+                               if (sipdebug)
+                                       ast_verbose("* DTMF-relay event received: %c\n", f.subclass);
+                       }
+               }
+               
+               if (strcasecmp(c,"on")== 0) {
+               
+                       ast_log(LOG_NOTICE,"Got a Request to Record the channel!\n");
+                       transmit_response(p, "200 OK", req);
+                       return;
+
+               } else if (strcasecmp(c,"off")== 0) {
+
+                       ast_log(LOG_NOTICE,"Got a Request to Stop Recording the channel\n");
+                       transmit_response(p, "200 OK", req);
+                       return;
+               }
        }
        /* Other type of INFO message, not really understood by Asterisk */
        /* if (get_msg_text(buf, sizeof(buf), req)) { */
index db25e7d..02b8fa5 100644 (file)
@@ -94,4 +94,8 @@ void ast_register_feature(struct ast_call_feature *feature);
     \param feature the ast_call_feature object which was registered before*/
 void ast_unregister_feature(struct ast_call_feature *feature);
 
+/*! \brief look for a feature entry by its sname
+       \param name a string ptr, should match "automon", "blindxfer", "atxfer", etc. */
+struct ast_call_feature *find_feature(char *name);
+
 #endif /* _AST_FEATURES_H */
index 25aa622..7cc4686 100644 (file)
@@ -1056,7 +1056,7 @@ static void ast_unregister_features(void)
 }
 
 /*! \brief find a feature by name */
-static struct ast_call_feature *find_feature(char *name)
+struct ast_call_feature *find_feature(char *name)
 {
        struct ast_call_feature *tmp;