Asterisk - The Open Source Telephony Project  21.4.1
Data Structures | Macros | Functions | Variables
image.c File Reference

Image Management. More...

#include "asterisk.h"
#include <sys/time.h>
#include <sys/stat.h>
#include <signal.h>
#include "asterisk/paths.h"
#include "asterisk/sched.h"
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/image.h"
#include "asterisk/translate.h"
#include "asterisk/cli.h"
#include "asterisk/lock.h"

Go to the source code of this file.

Data Structures

struct  imagers
 

Macros

#define FORMAT   "%10s %10s %50s %10s\n"
 
#define FORMAT2   "%10s %10s %50s %10s\n"
 

Functions

int ast_image_init (void)
 Initialize image stuff Initializes all the various image stuff. Basically just registers the cli stuff. More...
 
int ast_image_register (struct ast_imager *img)
 Register image format. More...
 
void ast_image_unregister (struct ast_imager *img)
 Unregister an image format. More...
 
struct ast_frameast_read_image (const char *filename, const char *preflang, struct ast_format *format)
 Make an image. More...
 
int ast_send_image (struct ast_channel *chan, const char *filename)
 Sends an image. More...
 
int ast_supports_images (struct ast_channel *chan)
 Check for image support on a channel. More...
 
static int file_exists (char *filename)
 
static char * handle_core_show_image_formats (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static void image_shutdown (void)
 
static void make_filename (char *buf, int len, const char *filename, const char *preflang, char *ext)
 

Variables

static struct ast_cli_entry cli_image []
 
static struct imagers imagers = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
 

Detailed Description

Image Management.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file image.c.

Function Documentation

int ast_image_init ( void  )

Initialize image stuff Initializes all the various image stuff. Basically just registers the cli stuff.

Returns
0 all the time

Definition at line 212 of file image.c.

References ast_cli_register_multiple, and ast_register_cleanup().

213 {
214  ast_cli_register_multiple(cli_image, ARRAY_LEN(cli_image));
215  ast_register_cleanup(image_shutdown);
216  return 0;
217 }
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
int ast_image_register ( struct ast_imager imgdrv)

Register image format.

Parameters
imgdrvPopulated ast_imager structure with info to register Registers an image format
Returns
0 regardless

Definition at line 48 of file image.c.

References AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_imager::desc, and ast_imager::name.

49 {
51  AST_RWLIST_INSERT_HEAD(&imagers, img, list);
53  ast_verb(5, "Registered format '%s' (%s)\n", img->name, img->desc);
54  return 0;
55 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
char * desc
Definition: image.h:29
char * name
Definition: image.h:28
Definition: image.c:46
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
void ast_image_unregister ( struct ast_imager imgdrv)

Unregister an image format.

Parameters
imgdrvpointer to the ast_imager structure you wish to unregister Unregisters the image format passed in.

Definition at line 57 of file image.c.

References AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_imager::desc, and ast_imager::name.

58 {
60  img = AST_RWLIST_REMOVE(&imagers, img, list);
62 
63  if (img)
64  ast_verb(5, "Unregistered format '%s' (%s)\n", img->name, img->desc);
65 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
char * desc
Definition: image.h:29
char * name
Definition: image.h:28
Definition: image.c:46
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
struct ast_frame* ast_read_image ( const char *  filename,
const char *  preflang,
struct ast_format format 
)

Make an image.

Parameters
filenamefilename of image to prepare
preflangpreferred language to get the image...?
formatthe format of the file, NULL for any image format Make an image from a filename ??? No estoy positivo
Return values
anast_frame on success
NULLon failure

Definition at line 101 of file image.c.

References ast_copy_string(), ast_format_cmp(), AST_FORMAT_CMP_EQUAL, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_imager::exts, ast_imager::format, ast_imager::identify, make_filename(), ast_imager::name, and ast_imager::read_image.

Referenced by ast_send_image().

102 {
103  struct ast_imager *i;
104  char buf[256];
105  char tmp[80];
106  char *e;
107  struct ast_imager *found = NULL;
108  int fd;
109  int len=0;
110  struct ast_frame *f = NULL;
111 
113  AST_RWLIST_TRAVERSE(&imagers, i, list) {
114  /* if NULL image format, just pick the first one, otherwise match it. */
115  if (!format || (ast_format_cmp(i->format, format) == AST_FORMAT_CMP_EQUAL)) {
116  char *stringp=NULL;
117  ast_copy_string(tmp, i->exts, sizeof(tmp));
118  stringp = tmp;
119  e = strsep(&stringp, "|");
120  while (e) {
121  make_filename(buf, sizeof(buf), filename, preflang, e);
122  if ((len = file_exists(buf))) {
123  found = i;
124  break;
125  }
126  make_filename(buf, sizeof(buf), filename, NULL, e);
127  if ((len = file_exists(buf))) {
128  found = i;
129  break;
130  }
131  e = strsep(&stringp, "|");
132  }
133  }
134  if (found)
135  break;
136  }
137 
138  if (found) {
139  fd = open(buf, O_RDONLY);
140  if (fd > -1) {
141  if (!found->identify || found->identify(fd)) {
142  /* Reset file pointer */
143  lseek(fd, 0, SEEK_SET);
144  f = found->read_image(fd, len);
145  } else
146  ast_log(LOG_WARNING, "%s does not appear to be a %s file\n", buf, found->name);
147  close(fd);
148  } else
149  ast_log(LOG_WARNING, "Unable to open '%s': %s\n", buf, strerror(errno));
150  } else
151  ast_log(LOG_WARNING, "Image file '%s' not found\n", filename);
152 
154 
155  return f;
156 }
structure associated with registering an image format
Definition: image.h:27
static void make_filename(const char *channel, char *filename, size_t size)
create the filename that will be used for a logger channel.
Definition: logger.c:589
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:78
struct ast_frame *(* read_image)(int fd, int len)
Definition: image.h:32
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition: format.c:201
int(* identify)(int fd)
Definition: image.h:33
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
Data structure associated with a single frame of data.
char * name
Definition: image.h:28
Definition: image.c:46
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
struct ast_format * format
Definition: image.h:31
char * exts
Definition: image.h:30
int ast_send_image ( struct ast_channel chan,
const char *  filename 
)

Sends an image.

Parameters
chanchannel to send image on
filenamefilename of image to send (minus extension) Sends an image on the given channel.
Return values
0on success
-1on error

Definition at line 158 of file image.c.

References ast_read_image(), and ast_channel_tech::send_image.

159 {
160  struct ast_frame *f;
161  int res = -1;
162  if (ast_channel_tech(chan)->send_image) {
163  f = ast_read_image(filename, ast_channel_language(chan), NULL);
164  if (f) {
165  res = ast_channel_tech(chan)->send_image(chan, f);
166  ast_frfree(f);
167  }
168  }
169  return res;
170 }
int(*const send_image)(struct ast_channel *chan, struct ast_frame *frame)
Display or send an image.
Definition: channel.h:759
struct ast_frame * ast_read_image(const char *filename, const char *preflang, struct ast_format *format)
Make an image.
Definition: image.c:101
Structure to describe a channel "technology", ie a channel driver See for examples: ...
Definition: channel.h:628
Data structure associated with a single frame of data.
int ast_supports_images ( struct ast_channel chan)

Check for image support on a channel.

Parameters
chanchannel to check Checks the channel to see if it supports the transmission of images
Returns
non-zero if image transmission is supported

Definition at line 67 of file image.c.

68 {
69  if (!chan || !ast_channel_tech(chan))
70  return 0;
71  if (!ast_channel_tech(chan)->send_image)
72  return 0;
73  return 1;
74 }
Structure to describe a channel "technology", ie a channel driver See for examples: ...
Definition: channel.h:628

Variable Documentation

struct ast_cli_entry cli_image[]
static
Initial value:
= {
{ .handler = handle_core_show_image_formats , .summary = "Displays image formats" ,}
}

Definition at line 203 of file image.c.