BaseList<T>::BaseList(const BaseList<T>& other): m_content (nullptr), m_size (other.m_size), m_min_capacity (other.m_min_capacity), m_is_shrinkable (other.m_is_shrinkable) { adjust_capacity(other.m_size); add_content(other.m_content, 0, other.m_size); }
static void interpret_att(GSList** stack, gchar** args) { GMimePart* pt = g_mime_part_new_with_type(args[1], args[2]); g_mime_part_set_filename(pt, args[0]); g_mime_part_set_content_encoding(pt, GMIME_CONTENT_ENCODING_BASE64); g_mime_object_set_content_id(GMIME_OBJECT(pt), args[0]); add_content(GMIME_CONTENT_ENCODING_BASE64, args[0], pt); add_part(stack, GMIME_OBJECT(pt)); }
inline BaseList<T>& BaseList<T>::operator=(const BaseList<T>& other) { if (this == &other) { return *this; } m_min_capacity = other.m_min_capacity; prepare_size(other.m_size); add_content(other.m_content, 0, other.m_size); return *this; }
static void interpret_text(GSList** stack, gchar** args) { GMimePart* pt = g_mime_part_new(); g_mime_part_set_content_encoding(pt, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE); g_mime_object_set_content_disposition( GMIME_OBJECT(pt), g_mime_content_disposition_new_from_string(GMIME_DISPOSITION_INLINE)); add_content(GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE, args[0], pt); add_part(stack, GMIME_OBJECT(pt)); }
static void content_added (TpCallChannel *proxy, TpCallContent *content_proxy, TfCallChannel *self) { /* Ignore signals before we got the "Contents" property to avoid races that * could cause the same content to be added twice */ if (!self->contents) return; add_content (self, content_proxy); }
static void show_dialog_with_header (GtkWindow *parent) { GtkWidget *dialog; dialog = gtk_dialog_new_with_buttons ("With Header", parent, GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR, "Close", GTK_RESPONSE_CLOSE, NULL); add_content (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); }
static void show_dialog_with_buttons (GtkWindow *parent) { GtkWidget *dialog; dialog = gtk_dialog_new_with_buttons ("With Buttons", parent, GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, "Close", GTK_RESPONSE_CLOSE, "Frob", 25, NULL); add_content (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); }
bool http_reply::stock_reply(http_reply::status_type status) { try { reset_buffer(); std::string const content = stock_replies::cast_to_string(status); std::size_t const content_size = content.size(); add_status(status); add_header("Content-Length", safe_lexical_cast<std::string>(content_size)); add_header("Content-Type", "text/html"); add_content(content.c_str(), content_size); } catch (std::exception const & expt) { return false; } return true; }
static void channel_prepared (GObject *proxy, GAsyncResult *prepare_res, gpointer user_data) { GSimpleAsyncResult *res = user_data; TfCallChannel *self = TF_CALL_CHANNEL (g_async_result_get_source_object (G_ASYNC_RESULT (res))); GError *error = NULL; GPtrArray *contents; guint i; if (!tp_proxy_prepare_finish (proxy, prepare_res, &error)) { g_warning ("Preparing the channel: %s", error->message); g_simple_async_result_take_error (res, error); goto out; } if (tp_call_channel_has_hardware_streaming (TP_CALL_CHANNEL (proxy))) { g_warning ("Hardware streaming property is TRUE, ignoring"); g_simple_async_result_set_error (res, TP_ERROR, TP_ERROR_NOT_CAPABLE, "This channel does hardware streaming, not handled here"); goto out; } contents = tp_call_channel_get_contents (TP_CALL_CHANNEL (proxy)); self->contents = g_ptr_array_new_with_free_func (free_content); for (i = 0; i < contents->len; i++) if (!add_content (self, g_ptr_array_index (contents, i))) break; g_simple_async_result_set_op_res_gboolean (res, TRUE); out: g_simple_async_result_complete (res); g_object_unref (res); g_object_unref (self); }
/* Parse one Texinfo file and create manpages according to the embedded instructions. */ static void parse_file (const char *fname, FILE *fp, char **section_name, int in_pause) { char *line; int lnr = 0; /* Fixme: The following state variables don't carry over to include files. */ int skip_to_end = 0; /* Used to skip over menu entries. */ int skip_sect_line = 0; /* Skip after @mansect. */ int item_indent = 0; /* How far is the current @item indented. */ /* Helper to define a macro. */ char *macroname = NULL; char *macrovalue = NULL; size_t macrovaluesize = 0; size_t macrovalueused = 0; line = xmalloc (LINESIZE); while (fgets (line, LINESIZE, fp)) { size_t n = strlen (line); int got_line = 0; char *p, *pend; lnr++; if (!n || line[n-1] != '\n') { err ("%s:%d: trailing linefeed missing, line too long or " "embedded Nul character", fname, lnr); break; } line[--n] = 0; /* Kludge to allow indentation of tables. */ for (p=line; *p == ' ' || *p == '\t'; p++) ; if (*p) { if (*p == '@' && !strncmp (p+1, "item", 4)) item_indent = p - line; /* Set a new indent level. */ else if (p - line < item_indent) item_indent = 0; /* Switch off indention. */ if (item_indent) { memmove (line, line+item_indent, n - item_indent + 1); n -= item_indent; } } if (*line == '@') { for (p=line+1, n=1; *p && *p != ' ' && *p != '\t'; p++) n++; while (*p == ' ' || *p == '\t') p++; } else p = line; /* Take action on macro. */ if (macroname) { if (n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t'||!line[4]) && !strncmp (p, "macro", 5) && (p[5]==' '||p[5]=='\t'||!p[5])) { if (macrovalueused) macrovalue[--macrovalueused] = 0; /* Kill the last LF. */ macrovalue[macrovalueused] = 0; /* Terminate macro. */ macrovalue = xrealloc (macrovalue, macrovalueused+1); set_macro (macroname, macrovalue); macrovalue = NULL; free (macroname); macroname = NULL; } else { if (macrovalueused + strlen (line) + 2 >= macrovaluesize) { macrovaluesize += strlen (line) + 256; macrovalue = xrealloc (macrovalue, macrovaluesize); } strcpy (macrovalue+macrovalueused, line); macrovalueused += strlen (line); macrovalue[macrovalueused++] = '\n'; } continue; } if (n >= 5 && !memcmp (line, "@node", 5) && (line[5]==' '||line[5]=='\t'||!line[5])) { /* Completey ignore @node lines. */ continue; } if (skip_sect_line) { skip_sect_line = 0; if (!strncmp (line, "@section", 8) || !strncmp (line, "@subsection", 11) || !strncmp (line, "@chapheading", 12)) continue; } /* We only parse lines we need and ignore the rest. There are a few macros used to control this as well as one @ifset command. Parts we know about are saved away into containers separate for each section. */ /* First process ifset/ifclear commands. */ if (*line == '@') { if (n == 6 && !memcmp (line, "@ifset", 6) && (line[6]==' '||line[6]=='\t')) { for (p=line+7; *p == ' ' || *p == '\t'; p++) ; if (!*p) { err ("%s:%d: name missing after \"@ifset\"", fname, lnr); continue; } for (pend=p; *pend && *pend != ' ' && *pend != '\t'; pend++) ; *pend = 0; /* Ignore rest of the line. */ push_condition (p, 1, fname, lnr); continue; } else if (n == 8 && !memcmp (line, "@ifclear", 8) && (line[8]==' '||line[8]=='\t')) { for (p=line+9; *p == ' ' || *p == '\t'; p++) ; if (!*p) { err ("%s:%d: name missing after \"@ifsclear\"", fname, lnr); continue; } for (pend=p; *pend && *pend != ' ' && *pend != '\t'; pend++) ; *pend = 0; /* Ignore rest of the line. */ push_condition (p, 0, fname, lnr); continue; } else if (n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t') && !strncmp (p, "ifset", 5) && (p[5]==' '||p[5]=='\t'||!p[5])) { pop_condition (1, fname, lnr); continue; } else if (n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t') && !strncmp (p, "ifclear", 7) && (p[7]==' '||p[7]=='\t'||!p[7])) { pop_condition (0, fname, lnr); continue; } } /* Take action on ifset/ifclear. */ if (!cond_is_active) continue; /* Process commands. */ if (*line == '@') { if (skip_to_end && n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t'||!line[4])) { skip_to_end = 0; } else if (cond_in_verbatim) { got_line = 1; } else if (n == 6 && !memcmp (line, "@macro", 6)) { macroname = xstrdup (p); macrovalue = xmalloc ((macrovaluesize = 1024)); macrovalueused = 0; } else if (n == 8 && !memcmp (line, "@manpage", 8)) { free (*section_name); *section_name = NULL; finish_page (); start_page (p); in_pause = 0; } else if (n == 8 && !memcmp (line, "@mansect", 8)) { if (!thepage.name) err ("%s:%d: section outside of a man page", fname, lnr); else { free (*section_name); *section_name = ascii_strupr (xstrdup (p)); in_pause = 0; skip_sect_line = 1; } } else if (n == 9 && !memcmp (line, "@manpause", 9)) { if (!*section_name) err ("%s:%d: pausing outside of a man section", fname, lnr); else if (in_pause) err ("%s:%d: already pausing", fname, lnr); else in_pause = 1; } else if (n == 8 && !memcmp (line, "@mancont", 8)) { if (!*section_name) err ("%s:%d: continue outside of a man section", fname, lnr); else if (!in_pause) err ("%s:%d: continue while not pausing", fname, lnr); else in_pause = 0; } else if (n == 5 && !memcmp (line, "@menu", 5) && (line[5]==' '||line[5]=='\t'||!line[5])) { skip_to_end = 1; } else if (n == 8 && !memcmp (line, "@include", 8) && (line[8]==' '||line[8]=='\t'||!line[8])) { char *incname = xstrdup (p); FILE *incfp = fopen (incname, "r"); if (!incfp && opt_include && *opt_include && *p != '/') { free (incname); incname = xmalloc (strlen (opt_include) + 1 + strlen (p) + 1); strcpy (incname, opt_include); if ( incname[strlen (incname)-1] != '/' ) strcat (incname, "/"); strcat (incname, p); incfp = fopen (incname, "r"); } if (!incfp) err ("can't open include file '%s':%s", incname, strerror (errno)); else { parse_file (incname, incfp, section_name, in_pause); fclose (incfp); } free (incname); } else if (n == 4 && !memcmp (line, "@bye", 4) && (line[4]==' '||line[4]=='\t'||!line[4])) { break; } else if (!skip_to_end) got_line = 1; } else if (!skip_to_end) got_line = 1; if (got_line && cond_in_verbatim) add_content (*section_name, line, 1); else if (got_line && thepage.name && *section_name && !in_pause) add_content (*section_name, line, 0); } if (ferror (fp)) err ("%s:%d: read error: %s", fname, lnr, strerror (errno)); free (macroname); free (macrovalue); free (line); }
static void process_args(int argc, char **argv) { char *ptr; int type = IH_TYPE_INVALID; char *datafile = NULL; int opt; while ((opt = getopt(argc, argv, "a:A:b:c:C:d:D:e:Ef:Fk:K:ln:p:O:rR:qsT:vVx")) != -1) { switch (opt) { case 'a': params.addr = strtoull(optarg, &ptr, 16); if (*ptr) { fprintf(stderr, "%s: invalid load address %s\n", params.cmdname, optarg); exit(EXIT_FAILURE); } break; case 'A': params.arch = genimg_get_arch_id(optarg); if (params.arch < 0) { show_valid_options(IH_ARCH); usage("Invalid architecture"); } break; case 'b': if (add_content(IH_TYPE_FLATDT, optarg)) { fprintf(stderr, "%s: Out of memory adding content '%s'", params.cmdname, optarg); exit(EXIT_FAILURE); } break; case 'c': params.comment = optarg; break; case 'C': params.comp = genimg_get_comp_id(optarg); if (params.comp < 0) { show_valid_options(IH_COMP); usage("Invalid compression type"); } break; case 'd': params.datafile = optarg; params.dflag = 1; break; case 'D': params.dtc = optarg; break; case 'e': params.ep = strtoull(optarg, &ptr, 16); if (*ptr) { fprintf(stderr, "%s: invalid entry point %s\n", params.cmdname, optarg); exit(EXIT_FAILURE); } params.eflag = 1; break; case 'E': params.external_data = true; break; case 'f': datafile = optarg; params.auto_its = !strcmp(datafile, "auto"); /* no break */ case 'F': /* * The flattened image tree (FIT) format * requires a flattened device tree image type */ params.type = IH_TYPE_FLATDT; params.fflag = 1; break; case 'k': params.keydir = optarg; break; case 'K': params.keydest = optarg; break; case 'l': params.lflag = 1; break; case 'n': params.imagename = optarg; break; case 'O': params.os = genimg_get_os_id(optarg); if (params.os < 0) { show_valid_options(IH_OS); usage("Invalid operating system"); } break; case 'p': params.external_offset = strtoull(optarg, &ptr, 16); if (*ptr) { fprintf(stderr, "%s: invalid offset size %s\n", params.cmdname, optarg); exit(EXIT_FAILURE); } break; case 'q': params.quiet = 1; break; case 'r': params.require_keys = 1; break; case 'R': /* * This entry is for the second configuration * file, if only one is not enough. */ params.imagename2 = optarg; break; case 's': params.skipcpy = 1; break; case 'T': type = genimg_get_type_id(optarg); if (type < 0) { show_valid_options(IH_TYPE); usage("Invalid image type"); } break; case 'v': params.vflag++; break; case 'V': printf("mkimage version %s\n", PLAIN_VERSION); exit(EXIT_SUCCESS); case 'x': params.xflag++; break; default: usage("Invalid option"); } } /* The last parameter is expected to be the imagefile */ if (optind < argc) params.imagefile = argv[optind]; /* * For auto-generated FIT images we need to know the image type to put * in the FIT, which is separate from the file's image type (which * will always be IH_TYPE_FLATDT in this case). */ if (params.type == IH_TYPE_FLATDT) { params.fit_image_type = type ? type : IH_TYPE_KERNEL; /* For auto_its, datafile is always 'auto' */ if (!params.auto_its) params.datafile = datafile; else if (!params.datafile) usage("Missing data file for auto-FIT (use -d)"); } else if (type != IH_TYPE_INVALID) { params.type = type; } if (!params.imagefile) usage("Missing output filename"); }
/* --- CCDN 初始化内容表 功能:从sr的ctable字段读取名字,在当前工作目录下找到相应的文件, 从文件中读取路由表entry,然后将每条entry加入到table里面. format is: content ver_num nexthop iface content and entry->content both use the format : xxx.xxx.xxx.xxx iface use format like : eth0*/ void init_ctable(struct sr_instance* sr) { /* get the ctable lock, --- CCDN lock */ //lock_ctable_wr(get_router_state(sr)); char path[256]; bzero(path, 256); getcwd(path, 256);//获取当前工作的绝对路径,存到path中 int len = strlen(path); path[len] = '/'; /** --- CCDN 要不就在这初始化ctable_name */ char ctable_name[32] = "ctable"; strncpy(sr->ctable, ctable_name, SR_NAMELEN); strcpy(path+len+1, sr->ctable); FILE* file = fopen(path, "r"); if (file == NULL) { perror("Failure opening file"); exit(1); } /* 前面这一大块干的是就是在工作目录下找到一个文件(例如ctable),里面存路由表之类的信息 */ char buf[1024]; bzero(buf, 1024); router_state* rs = (router_state*)sr->interface_subsystem; int count = 0; /* walk through the file one line at a time adding its contents to the ctable */ /* 下面这个while干的事情是从文件中读取CCCP表,然后把它们加入到rtable里面 */ while (fgets(buf, 1024, file) != NULL) { char* content = NULL; char* ver_num = NULL; char* nexthop = NULL; char* iface = NULL; if (sscanf(buf, "%as %as %as %as", &content, &ver_num, &nexthop, &iface) != 4) { printf("Failure reading from ctable file\n"); } ctable_entry* entry = (ctable_entry*)malloc(sizeof(ctable_entry)); bzero(entry, sizeof(ctable_entry)); // bzero,清空整个地址空间 if (inet_pton(AF_INET, content, &(entry->content)) == 0) {//点分十进制->整数之间的转换,AF_INET指地址簇,可以理解为IPv4 perror("Failure reading ctable"); // perror:标准错误流,会讲错误的原因输出到屏幕上。 } if (inet_pton(AF_INET, nexthop, &(entry->nexthop)) == 0) { perror("Failure reading rtable"); } entry->ver_num = (uint16_t)atoi(ver_num); strncpy(entry->iface, iface, 32); entry->is_active = 1; entry->is_static = 1; /* create a node, set data pointer to the new entry */ node* n = node_create(); n->data = entry; /** original code if (rs->ctable == NULL) { rs->ctable = n; } else { node_push_back(rs->ctable, n); } */ /** --- CCDN for test, can be deleted... */ count++; switch(add_content(rs, &(entry->content), entry->ver_num, &(entry->nexthop), iface) ){ case 0: printf("#%d, add_content PUSH !\n", count); break; case 1: printf("#%d, add_content UPDATE !\n", count); break; case 2: printf("#%d, add_content INSERT !\n", count); break; case -1: printf("#%d, add_content FAILED !\n", count); break; } //printf("has delete %d entry \n ", del_content(rs, &(entry->content))); /** --- CCDN for test, can be deleted... */ char content_array[INET_ADDRSTRLEN]; char nexthop_array[INET_ADDRSTRLEN]; printf("Read: %s ", inet_ntop(AF_INET, &(entry->content), content_array, INET_ADDRSTRLEN)); printf("%s ", inet_ntop(AF_INET, &(entry->nexthop), nexthop_array, INET_ADDRSTRLEN)); printf("%s\n", entry->iface); } if (fclose(file) != 0) { perror("Failure closing file"); } /** --- CCDN for test, can be deleted... */ node* tn = rs->ctable; int index = 0; while(tn){ index++; printf("index:%d \n", index); tn = tn->next; } /** --- CCDN for test, can be deleted... */ write_ctable_to_hw(rs); printf("init_ctable finish! \n"); /* release the rtable lock, --- CCDN lock */ //unlock_ctable(get_router_state(sr)); /** this code is used for eliminate the init rtable added by dijkstra of netfpga, do not delete it */ //eliminate_init_rtable(get_router_state(sr)); /** */ }
/* Parse one Texinfo file and create manpages according to the embedded instructions. */ static void parse_file (const char *fname, FILE *fp, char **section_name, int in_pause) { char *line; int lnr = 0; /* Fixme: The following state variables don't carry over to include files. */ int in_verbatim = 0; int skip_to_end = 0; /* Used to skip over menu entries. */ int skip_sect_line = 0; /* Skip after @mansect. */ int ifset_nesting = 0; /* How often a ifset has been seen. */ int ifclear_nesting = 0; /* How often a ifclear has been seen. */ int in_gpgone = 0; /* Keep track of "@ifset gpgone" parts. */ int not_in_gpgone = 0; /* Keep track of "@ifclear gpgone" parts. */ int not_in_man = 0; /* Keep track of "@ifclear isman" parts. */ /* Helper to define a macro. */ char *macroname = NULL; char *macrovalue = NULL; size_t macrovaluesize = 0; size_t macrovalueused = 0; line = xmalloc (LINESIZE); while (fgets (line, LINESIZE, fp)) { size_t n = strlen (line); int got_line = 0; char *p; lnr++; if (!n || line[n-1] != '\n') { err ("%s:%d: trailing linefeed missing, line too long or " "embedded Nul character", fname, lnr); break; } line[--n] = 0; if (*line == '@') { for (p=line+1, n=1; *p && *p != ' ' && *p != '\t'; p++) n++; while (*p == ' ' || *p == '\t') p++; } else p = line; /* Take action on macro. */ if (macroname) { if (n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t'||!line[4]) && !strncmp (p, "macro", 5) && (p[5]==' '||p[5]=='\t'||!p[5])) { macro_t m; if (macrovalueused) macrovalue[--macrovalueused] = 0; /* Kill the last LF. */ macrovalue[macrovalueused] = 0; /* Terminate macro. */ macrovalue = xrealloc (macrovalue, macrovalueused+1); for (m= macrolist; m; m = m->next) if (!strcmp (m->name, macroname)) break; if (m) free (m->value); else { m = xcalloc (1, sizeof *m + strlen (macroname)); strcpy (m->name, macroname); m->next = macrolist; macrolist = m; } m->value = macrovalue; macrovalue = NULL; free (macroname); macroname = NULL; } else { if (macrovalueused + strlen (line) + 2 >= macrovaluesize) { macrovaluesize += strlen (line) + 256; macrovalue = xrealloc (macrovalue, macrovaluesize); } strcpy (macrovalue+macrovalueused, line); macrovalueused += strlen (line); macrovalue[macrovalueused++] = '\n'; } continue; } if (n >= 5 && !memcmp (line, "@node", 5) && (line[5]==' '||line[5]=='\t'||!line[5])) { /* Completey ignore @node lines. */ continue; } if (skip_sect_line) { skip_sect_line = 0; if (!strncmp (line, "@section", 8) || !strncmp (line, "@subsection", 11) || !strncmp (line, "@chapheading", 12)) continue; } /* We only parse lines we need and ignore the rest. There are a few macros used to control this as well as one @ifset command. Parts we know about are saved away into containers separate for each section. */ /* First process ifset/ifclear commands. */ if (*line == '@') { if (n == 6 && !memcmp (line, "@ifset", 6) && (line[6]==' '||line[6]=='\t')) { ifset_nesting++; if (!strncmp (p, "manverb", 7) && (p[7]==' '||p[7]=='\t'||!p[7])) { if (in_verbatim) err ("%s:%d: nested \"@ifset manverb\"", fname, lnr); else in_verbatim = ifset_nesting; } else if (!strncmp (p, "gpgone", 6) && (p[6]==' '||p[6]=='\t'||!p[6])) { if (in_gpgone) err ("%s:%d: nested \"@ifset gpgone\"", fname, lnr); else in_gpgone = ifset_nesting; } continue; } else if (n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t') && !strncmp (p, "ifset", 5) && (p[5]==' '||p[5]=='\t'||!p[5])) { if (in_verbatim && ifset_nesting == in_verbatim) in_verbatim = 0; if (in_gpgone && ifset_nesting == in_gpgone) in_gpgone = 0; if (ifset_nesting) ifset_nesting--; else err ("%s:%d: unbalanced \"@end ifset\"", fname, lnr); continue; } else if (n == 8 && !memcmp (line, "@ifclear", 8) && (line[8]==' '||line[8]=='\t')) { ifclear_nesting++; if (!strncmp (p, "gpgone", 6) && (p[6]==' '||p[6]=='\t'||!p[6])) { if (not_in_gpgone) err ("%s:%d: nested \"@ifclear gpgone\"", fname, lnr); else not_in_gpgone = ifclear_nesting; } else if (!strncmp (p, "isman", 5) && (p[5]==' '||p[5]=='\t'||!p[5])) { if (not_in_man) err ("%s:%d: nested \"@ifclear isman\"", fname, lnr); else not_in_man = ifclear_nesting; } continue; } else if (n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t') && !strncmp (p, "ifclear", 7) && (p[7]==' '||p[7]=='\t'||!p[7])) { if (not_in_gpgone && ifclear_nesting == not_in_gpgone) not_in_gpgone = 0; if (not_in_man && ifclear_nesting == not_in_man) not_in_man = 0; if (ifclear_nesting) ifclear_nesting--; else err ("%s:%d: unbalanced \"@end ifclear\"", fname, lnr); continue; } } /* Take action on ifset/ifclear. */ if ( (in_gpgone && !gpgone_defined) || (not_in_gpgone && gpgone_defined) || not_in_man) continue; /* Process commands. */ if (*line == '@') { if (skip_to_end && n == 4 && !memcmp (line, "@end", 4) && (line[4]==' '||line[4]=='\t'||!line[4])) { skip_to_end = 0; } else if (in_verbatim) { got_line = 1; } else if (n == 6 && !memcmp (line, "@macro", 6)) { macroname = xstrdup (p); macrovalue = xmalloc ((macrovaluesize = 1024)); macrovalueused = 0; } else if (n == 8 && !memcmp (line, "@manpage", 8)) { free (*section_name); *section_name = NULL; finish_page (); start_page (p); in_pause = 0; } else if (n == 8 && !memcmp (line, "@mansect", 8)) { if (!thepage.name) err ("%s:%d: section outside of a man page", fname, lnr); else { free (*section_name); *section_name = ascii_strupr (xstrdup (p)); in_pause = 0; skip_sect_line = 1; } } else if (n == 9 && !memcmp (line, "@manpause", 9)) { if (!*section_name) err ("%s:%d: pausing outside of a man section", fname, lnr); else if (in_pause) err ("%s:%d: already pausing", fname, lnr); else in_pause = 1; } else if (n == 8 && !memcmp (line, "@mancont", 8)) { if (!*section_name) err ("%s:%d: continue outside of a man section", fname, lnr); else if (!in_pause) err ("%s:%d: continue while not pausing", fname, lnr); else in_pause = 0; } else if (n == 5 && !memcmp (line, "@menu", 5) && (line[5]==' '||line[5]=='\t'||!line[5])) { skip_to_end = 1; } else if (n == 8 && !memcmp (line, "@include", 8) && (line[8]==' '||line[8]=='\t'||!line[8])) { char *incname = xstrdup (p); FILE *incfp = fopen (incname, "r"); if (!incfp && opt_include && *opt_include && *p != '/') { free (incname); incname = xmalloc (strlen (opt_include) + 1 + strlen (p) + 1); strcpy (incname, opt_include); if ( incname[strlen (incname)-1] != '/' ) strcat (incname, "/"); strcat (incname, p); incfp = fopen (incname, "r"); } if (!incfp) err ("can't open include file `%s':%s", incname, strerror (errno)); else { parse_file (incname, incfp, section_name, in_pause); fclose (incfp); } free (incname); } else if (n == 4 && !memcmp (line, "@bye", 4) && (line[4]==' '||line[4]=='\t'||!line[4])) { break; } else if (!skip_to_end) got_line = 1; } else if (!skip_to_end) got_line = 1; if (got_line && in_verbatim) add_content (*section_name, line, 1); else if (got_line && thepage.name && *section_name && !in_pause) add_content (*section_name, line, 0); } if (ferror (fp)) err ("%s:%d: read error: %s", fname, lnr, strerror (errno)); free (macroname); free (macrovalue); free (line); }
/** * This function will create the PUBLISH message and send it. it also starts the retry timer. * * @param[in] pcb_p - pointer to PCB * @param[in] authen - boolean that indicates whether to add authorization header. * * @return TRUE if it successfully sent PUBLISH * Otherwise, FALSE is returned * * @pre (pcb_p != NULL) */ static boolean sipSPISendPublish (ccsip_publish_cb_t *pcb_p, boolean authen) { static const char fname[] = "sipSPISendPublish"; static uint32_t cseq = 0; char dest_sip_addr_str[MAX_IPADDR_STR_LEN]; char *domainloc; char src_addr_str[MAX_IPADDR_STR_LEN]; char sip_temp_str[MAX_SIP_URL_LENGTH]; char sip_temp_tag[MAX_SIP_URL_LENGTH]; uint8_t mac_address[MAC_ADDRESS_LENGTH]; char via[SIP_MAX_VIA_LENGTH]; int max_forwards_value = 70; static uint16_t count = 1; sipMessage_t *request = NULL; int timeout = 0; request = GET_SIP_MESSAGE(); if (!request) { return FALSE; } /* * Populate full RURI if it is not yet. Sometimes, applications may only provide user part. */ if (pcb_p->full_ruri[0] == 0) { sstrncpy(pcb_p->full_ruri, "sip:", MAX_SIP_URL_LENGTH); sstrncat(pcb_p->full_ruri, pcb_p->ruri, MAX_SIP_URL_LENGTH - sizeof("sip:")); /* check if it has host part */ domainloc = strchr(pcb_p->full_ruri, '@'); if (domainloc == NULL) { domainloc = pcb_p->full_ruri + strlen(pcb_p->full_ruri); if ((domainloc - pcb_p->full_ruri) < (MAX_SIP_URL_LENGTH - 1)) { /* Do not include @ when there is no user part */ if (pcb_p->ruri[0] != '\0') { *domainloc++ = '@'; } ipaddr2dotted(dest_sip_addr_str, &pcb_p->hb.dest_sip_addr); sstrncpy(domainloc, dest_sip_addr_str, MAX_SIP_URL_LENGTH - (domainloc - (pcb_p->full_ruri))); } } } ipaddr2dotted(src_addr_str, &pcb_p->hb.src_addr); // Add request line if (HSTATUS_SUCCESS != sippmh_add_request_line(request, sipGetMethodString(sipMethodPublish), pcb_p->full_ruri, SIP_VERSION)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Request line\n", fname); free_sip_message(request); return (FALSE); } // Add local Via snprintf(via, sizeof(via), "SIP/2.0/%s %s:%d;%s=%s%.8x", sipTransportGetTransportType(1, TRUE, NULL), src_addr_str, pcb_p->hb.local_port, VIA_BRANCH, VIA_BRANCH_START, (unsigned int) cpr_rand()); if (HSTATUS_SUCCESS != sippmh_add_text_header(request, SIP_HEADER_VIA, via)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding VIA header\n", fname); free_sip_message(request); return (FALSE); } // Add To Header snprintf(sip_temp_str, MAX_SIP_URL_LENGTH, "<%s>", pcb_p->full_ruri); if (HSTATUS_SUCCESS != sippmh_add_text_header(request, SIP_HEADER_TO, sip_temp_str)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding TO header\n", fname); free_sip_message(request); return (FALSE); } // Add From Header. sstrncat(sip_temp_str, ";tag=", MAX_SIP_URL_LENGTH - strlen(sip_temp_str)); sip_util_make_tag(sip_temp_tag); sstrncat(sip_temp_str, sip_temp_tag, MAX_SIP_URL_LENGTH - strlen(sip_temp_str)); if (HSTATUS_SUCCESS != sippmh_add_text_header(request, SIP_HEADER_FROM, sip_temp_str)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding FROM header\n", fname); free_sip_message(request); return (FALSE); } // Add Call-ID Header. platform_get_wired_mac_address(mac_address); count++; snprintf(pcb_p->hb.sipCallID, MAX_SIP_CALL_ID, "%.4x%.4x-%.4x%.4x-%.8x-%.8x@%s", // was MAX_SIP_URL_LENGTH mac_address[0] * 256 + mac_address[1], mac_address[2] * 256 + mac_address[3], mac_address[4] * 256 + mac_address[5], count, (unsigned int) cpr_rand(), (unsigned int) cpr_rand(), src_addr_str); if (HSTATUS_SUCCESS != sippmh_add_text_header(request, SIP_HEADER_CALLID, pcb_p->hb.sipCallID)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding CALLID header\n", fname); free_sip_message(request); return (FALSE); } // Add Contact header. Contact header is not needed as per RFC. BUT CCM needs it. snprintf(sip_temp_str, MAX_SIP_URL_LENGTH, "<sip:%.4x%.4x%.4x@%s:%d>", mac_address[0] * 256 + mac_address[1], mac_address[2] * 256 + mac_address[3], mac_address[4] * 256 + mac_address[5], src_addr_str, pcb_p->hb.local_port); if (HSTATUS_SUCCESS != sippmh_add_text_header(request, SIP_HEADER_CONTACT, sip_temp_str)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Contact header\n", fname); free_sip_message(request); return (FALSE); } // Add Cseq. cseq++; if (cseq == 0) { cseq = 1; } if (HSTATUS_SUCCESS != sippmh_add_cseq(request, sipGetMethodString(sipMethodPublish), cseq)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding CSEQ header\n", fname); free_sip_message(request); return (FALSE); } // Add UserAgent header (void) sippmh_add_text_header(request, SIP_HEADER_USER_AGENT, sipHeaderUserAgent); // Add SIP-If-Match header. if (pcb_p->entity_tag != NULL) { if (HSTATUS_SUCCESS != sippmh_add_text_header(request, SIP_HEADER_SIPIFMATCH, pcb_p->entity_tag)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Event header\n", fname); free_sip_message(request); return (FALSE); } } // Add Expires Header if (HSTATUS_SUCCESS != sippmh_add_int_header(request, SIP_HEADER_EXPIRES, pcb_p->hb.orig_expiration)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Expires header\n", fname); free_sip_message(request); return (FALSE); } // Add max-forwards header config_get_value(CFGID_SIP_MAX_FORWARDS, &max_forwards_value, sizeof(max_forwards_value)); if (HSTATUS_SUCCESS != sippmh_add_int_header(request, SIP_HEADER_MAX_FORWARDS, max_forwards_value)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Max-Forwards header\n", fname); free_sip_message(request); return (FALSE); } // add Authorization header if (authen) { if (HSTATUS_SUCCESS != sippmh_add_text_header(request, AUTHOR_HDR(pcb_p->hb.authen.status_code), pcb_p->hb.authen.authorization)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Authorization header\n", fname); free_sip_message(request); return (FALSE); } } // Add content, if any if (pcb_p->hb.event_data_p) { if (add_content(pcb_p->hb.event_data_p, request, fname) == FALSE) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Content\n", fname); free_sip_message(request); return (FALSE); } } else { if (HSTATUS_SUCCESS != sippmh_add_int_header(request, SIP_HEADER_CONTENT_LENGTH, 0)) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error in adding Content-Len\n", fname); free_sip_message(request); return (FALSE); } } ccsip_common_util_set_retry_settings(&pcb_p->hb, &timeout); if (sipTransportCreateSendMessage(NULL, request, sipMethodPublish, &(pcb_p->hb.dest_sip_addr), (int16_t) pcb_p->hb.dest_sip_port, FALSE, TRUE, timeout, pcb_p, RELDEV_NO_STORED_MSG) < 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"failed to send PUBLISH message\n", fname); return (FALSE); } return (TRUE); }
//--------------------------------------------------------------------------------------- ImoObj* Linker::add_child_to_model(ImoObj* pParent, ImoObj* pChild, int ldpChildType) { //If the object (or its content, for DTOs) is added to the model it must return NULL. //Othewise, it must return the received object. This behaviour is necessary to //simplify unit tests of LdpAnalyser m_ldpChildType = ldpChildType; m_pParent = pParent; switch(pChild->get_obj_type()) { case k_imo_bezier_info: return add_bezier(static_cast<ImoBezierInfo*>(pChild)); case k_imo_content: return add_content(static_cast<ImoContent*>(pChild)); case k_imo_cursor_info: return add_cursor(static_cast<ImoCursorInfo*>(pChild)); case k_imo_font_style_dto: return add_font_style(static_cast<ImoFontStyleDto*>(pChild)); case k_imo_instrument: return add_instrument(static_cast<ImoInstrument*>(pChild)); case k_imo_instr_group: return add_instruments_group(static_cast<ImoInstrGroup*>(pChild)); case k_imo_listitem: return add_listitem(static_cast<ImoListItem*>(pChild)); case k_imo_midi_info: return add_midi_info(static_cast<ImoMidiInfo*>(pChild)); case k_imo_music_data: return add_child(k_imo_instrument, pChild); case k_imo_option: return add_option(static_cast<ImoOptionInfo*>(pChild)); case k_imo_page_info: return add_page_info(static_cast<ImoPageInfo*>(pChild)); case k_imo_param_info: return add_param_info(static_cast<ImoParamInfo*>(pChild)); case k_imo_score_text: return add_text(static_cast<ImoScoreText*>(pChild)); case k_imo_score_title: return add_title(static_cast<ImoScoreTitle*>(pChild)); case k_imo_staff_info: return add_staff_info(static_cast<ImoStaffInfo*>(pChild)); case k_imo_styles: return add_child(k_imo_document, pChild); case k_imo_system_info: return add_system_info(static_cast<ImoSystemInfo*>(pChild)); case k_imo_style: return add_style(static_cast<ImoStyle*>(pChild)); case k_imo_table_row: { if (m_pParent) { if (m_pParent->is_table_head()) return add_child(k_imo_table_head, pChild); else if (m_pParent->is_table_body()) return add_child(k_imo_table_body, pChild); else return pChild; } else return pChild; } case k_imo_table_head: case k_imo_table_body: { if (m_pParent && m_pParent->is_table()) return add_child(k_imo_table, pChild); else return pChild; } default: if (pChild->is_block_level_obj()) return add_block_level_item(static_cast<ImoBlockLevelObj*>(pChild)); else if (pChild->is_inline_level_obj()) return add_inline_level_item(static_cast<ImoInlineLevelObj*>(pChild)); else if (pChild->is_staffobj()) return add_staffobj(static_cast<ImoStaffObj*>(pChild)); else if (pChild->is_relobj()) return add_relation(static_cast<ImoRelObj*>(pChild)); else if (pChild->is_auxobj()) return add_attachment(static_cast<ImoAuxObj*>(pChild)); else return pChild; } }