Add new callerpres parsing API (bug #3648)
authorMark Spencer <markster@digium.com>
Sat, 26 Feb 2005 07:34:09 +0000 (07:34 +0000)
committerMark Spencer <markster@digium.com>
Sat, 26 Feb 2005 07:34:09 +0000 (07:34 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5086 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_setcallerid.c
callerid.c
channels/chan_sip.c
include/asterisk/callerid.h

index 100fb81..78bd17c 100755 (executable)
@@ -31,25 +31,9 @@ STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
 
-static struct {
-       int val;
-       char *name;
-} preses[] = {
-       {  AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, "allowed_not_screened" },
-       {  AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, "allowed_passed_screen" },
-       {  AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN, "allowed_failed_screen" },
-       {  AST_PRES_ALLOWED_NETWORK_NUMBER, "allowed" },
-       {  AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED     , "prohib_not_screened" },
-       {  AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN, "prohib_passed_screen" },
-       {  AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN, "prohib_failed_screen" },
-       {  AST_PRES_PROHIB_NETWORK_NUMBER, "prohib" },
-       {  AST_PRES_NUMBER_NOT_AVAILABLE, "unavailable" },
-};
-
 static char *descrip2 = 
-"  SetCallerPres(presentation): Set Caller*ID presentation on\n"
-"a call to a new value.  Sets ANI as well if a flag is used.\n"
-"Always returns 0.  Valid presentations are:\n"
+"  SetCallerPres(presentation): Set Caller*ID presentation on a call.\n"
+"  Always returns 0.  Valid presentations are:\n"
 "\n"
 "      allowed_not_screened    : Presentation Allowed, Not Screened\n"
 "      allowed_passed_screen   : Presentation Allowed, Passed Screen\n" 
@@ -65,33 +49,21 @@ static char *descrip2 =
 
 static int setcallerid_pres_exec(struct ast_channel *chan, void *data)
 {
-       int res = 0;
-       char tmp[256] = "";
        struct localuser *u;
-       int x;
-       char *opts;
        int pres = -1;
-       if (data)
-               strncpy(tmp, (char *)data, sizeof(tmp) - 1);
-       opts = strchr(tmp, '|');
-       if (opts) {
-               *opts = '\0';
-               opts++;
-       }
-       for (x=0;x<sizeof(preses) / sizeof(preses[0]);x++) {
-               if (!strcasecmp(preses[x].name, tmp)) {
-                       pres = preses[x].val;
-                       break;
-               }
-       }
+
+       pres = ast_parse_caller_presentation(data);
+
        if (pres < 0) {
-               ast_log(LOG_WARNING, "'%s' is not a valid presentation (see 'show application SetCallerPres')\n", tmp);
+               ast_log(LOG_WARNING, "'%s' is not a valid presentation (see 'show application SetCallerPres')\n",
+                       (char *) data);
                return 0;
        }
+
        LOCAL_USER_ADD(u);
        chan->cid.cid_pres = pres;
        LOCAL_USER_REMOVE(u);
-       return res;
+       return 0;
 }
 
 
index 19d0d4b..3a55a73 100755 (executable)
@@ -715,3 +715,43 @@ int ast_callerid_split(const char *buf, char *name, int namelen, char *num, int
                num[0] = '\0';
        return 0;
 }
+
+static struct {
+       int val;
+       char *name;
+       char *description;
+} pres_types[] = {
+       {  AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, "allowed_not_screened", "Presentation Allowed, Not Screened"},
+       {  AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, "allowed_passed_screen", "Presentation Allowed, Passed Screen"},
+       {  AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN, "allowed_failed_screen", "Presentation Allowed, Failed Screen"},
+       {  AST_PRES_ALLOWED_NETWORK_NUMBER, "allowed", "Presentation Allowed, Network Number"},
+       {  AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED, "prohib_not_screened", "Presentation Prohibited, Not Screened"},
+       {  AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN, "prohib_passed_screen", "Presentation Prohibited, Passed Screen"},
+       {  AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN, "prohib_failed_screen", "Presentation Prohibited, Failed Screen"},
+       {  AST_PRES_PROHIB_NETWORK_NUMBER, "prohib", "Presentation Prohibited, Network Number"},
+       {  AST_PRES_NUMBER_NOT_AVAILABLE, "unavailable", "Number Unavailable"},
+};
+
+int ast_parse_caller_presentation(const char *data)
+{
+       int i;
+
+       for (i = 0; i < ((sizeof(pres_types) / sizeof(pres_types[0]))); i++) {
+               if (!strcasecmp(pres_types[i].name, data))
+                       return pres_types[i].val;
+       }
+
+       return -1;
+}
+
+const char *ast_describe_caller_presentation(int data)
+{
+       int i;
+
+       for (i = 0; i < ((sizeof(pres_types) / sizeof(pres_types[0]))); i++) {
+               if (pres_types[i].val == data)
+                       return pres_types[i].description;
+       }
+
+       return "unknown";
+}
index 5a56961..97c9e35 100755 (executable)
@@ -3864,7 +3864,7 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, c
        if (!l || (!ast_isphonenumber(l) && default_callerid[0]))
                        l = default_callerid;
        /* if user want's his callerid restricted */
-       if (p->callingpres & AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED) {
+       if ((p->callingpres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED) {
                l = CALLERID_UNKNOWN;
                n = l;
        }
@@ -6256,7 +6256,8 @@ static int sip_show_peer(int fd, int argc, char *argv[])
                ast_cli(fd, "  Language     : %s\n", peer->language);
                if (!ast_strlen_zero(peer->accountcode))
                        ast_cli(fd, "  Accountcode  : %s\n", peer->accountcode);
-               ast_cli(fd, "  AMA flag     : %s\n", ast_cdr_flags2str(peer->amaflags));
+               ast_cli(fd, "  AMA flags    : %s\n", ast_cdr_flags2str(peer->amaflags));
+               ast_cli(fd, "  CallingPres  : %s\n", ast_describe_caller_presentation(peer->callingpres));
                if (!ast_strlen_zero(peer->fromuser))
                        ast_cli(fd, "  FromUser     : %s\n", peer->fromuser);
                if (!ast_strlen_zero(peer->fromdomain))
@@ -6357,7 +6358,8 @@ static int sip_show_user(int fd, int argc, char *argv[])
                ast_cli(fd, "  Language     : %s\n", user->language);
                if (!ast_strlen_zero(user->accountcode))
                        ast_cli(fd, "  Accountcode  : %s\n", user->accountcode);
-               ast_cli(fd, "  AMA flag     : %s\n", ast_cdr_flags2str(user->amaflags));
+               ast_cli(fd, "  AMA flags    : %s\n", ast_cdr_flags2str(user->amaflags));
+               ast_cli(fd, "  CallingPres  : %s\n", ast_describe_caller_presentation(user->callingpres));
                ast_cli(fd, "  Inc. limit   : %d\n", user->incominglimit);
                ast_cli(fd, "  Outg. limit  : %d\n", user->outgoinglimit);
                ast_cli(fd, "  Callgroup    : ");
@@ -9113,7 +9115,9 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
                        } else if (!strcasecmp(v->name, "disallow")) {
                                ast_parse_allow_disallow(&user->prefs, &user->capability, v->value, 0);
                        } else if (!strcasecmp(v->name, "callingpres")) {
-                               user->callingpres = atoi(v->value);
+                               user->callingpres = ast_parse_caller_presentation(v->value);
+                               if (user->callingpres == -1)
+                                       user->callingpres = atoi(v->value);
                        }
                        /*else if (strcasecmp(v->name,"type"))
                         *      ast_log(LOG_WARNING, "Ignoring %s\n", v->name);
@@ -9316,7 +9320,9 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                                else
                                        peer->addr.sin_port = htons(atoi(v->value));
                        } else if (!strcasecmp(v->name, "callingpres")) {
-                               peer->callingpres = atoi(v->value);
+                               peer->callingpres = ast_parse_caller_presentation(v->value);
+                               if (peer->callingpres == -1)
+                                       peer->callingpres = atoi(v->value);
                        } else if (!strcasecmp(v->name, "username")) {
                                strncpy(peer->username, v->value, sizeof(peer->username)-1);
                        } else if (!strcasecmp(v->name, "language")) {
index 15497be..ce33879 100755 (executable)
@@ -190,16 +190,6 @@ static inline float callerid_getcarrier(float *cr, float *ci, int bit)
        return *cr;
 }      
 
-#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED      0x00
-#define AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN     0x01
-#define AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN     0x02
-#define AST_PRES_ALLOWED_NETWORK_NUMBER                                0x03
-#define AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED       0x20
-#define AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN      0x21
-#define AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN      0x22
-#define AST_PRES_PROHIB_NETWORK_NUMBER                         0x23
-#define AST_PRES_NUMBER_NOT_AVAILABLE                          0x43
-
 #define PUT_BYTE(a) do { \
        *(buf++) = (a); \
        bytes++; \
@@ -237,5 +227,48 @@ static inline float callerid_getcarrier(float *cr, float *ci, int bit)
        PUT_CLID_BAUD(1);       /* Stop bit */ \
 } while(0);    
 
+/* Various defines and bits for handling PRI- and SS7-type restriction */
+
+#define AST_PRES_NUMBER_TYPE                           0x03
+#define AST_PRES_USER_NUMBER_UNSCREENED                        0x00
+#define AST_PRES_USER_NUMBER_PASSED_SCREEN             0x01
+#define AST_PRES_USER_NUMBER_FAILED_SCREEN             0x02
+#define AST_PRES_NETWORK_NUMBER                                0x03
+
+#define AST_PRES_RESTRICTION                           0x60
+#define AST_PRES_ALLOWED                               0x00
+#define AST_PRES_RESTRICTED                            0x20
+#define AST_PRES_UNAVAILABLE                           0x40
+#define AST_PRES_RESERVED                              0x60
+
+#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED \
+       AST_PRES_USER_NUMBER_UNSCREENED + AST_PRES_ALLOWED
+
+#define AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN \
+       AST_PRES_USER_NUMBER_PASSED_SCREEN + AST_PRES_ALLOWED
+
+#define AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN \
+       AST_PRES_USER_NUMBER_FAILED_SCREEN + AST_PRES_ALLOWED
+
+#define AST_PRES_ALLOWED_NETWORK_NUMBER        \
+       AST_PRES_NETWORK_NUMBER + AST_PRES_ALLOWED
+
+#define AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED \
+       AST_PRES_USER_NUMBER_UNSCREENED + AST_PRES_RESTRICTED
+
+#define AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN \
+       AST_PRES_USER_NUMBER_PASSED_SCREEN + AST_PRES_RESTRICTED
+
+#define AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN \
+       AST_PRES_USER_NUMBER_FAILED_SCREEN + AST_PRES_RESTRICTED
+
+#define AST_PRES_PROHIB_NETWORK_NUMBER \
+       AST_PRES_NETWORK_NUMBER + AST_PRES_RESTRICTED
+
+#define AST_PRES_NUMBER_NOT_AVAILABLE \
+       AST_PRES_NETWORK_NUMBER + AST_PRES_UNAVAILABLE
+
+int ast_parse_caller_presentation(const char *data);
+const char *ast_describe_caller_presentation(int data);
 
 #endif