bool mime_builder::save_as(acl::ofstream& fp) { acl::string buf; if (attachs_.empty()) { //header_.set_type(MIME_CTYPE_TEXT, body_html_ ? // MIME_STYPE_HTML : MIME_STYPE_PLAIN); header_.set_type("text", body_html_ ? "html" : "plain"); header_.add_header("Content-Transfer-Encoding", "base64"); } else { //header_.set_type(MIME_CTYPE_MULTIPART, // MIME_STYPE_MIXED); header_.set_type("multipart", "mixed"); delimeter_.format("------=_Part_%d_%ld.%ld", getpid(), acl_pthread_self(), time(NULL)); header_.set_boundary(delimeter_.c_str()); } header_.build_head(buf, false); if (fp.write(buf) == -1) { logger_error("write head to file %s error %s", fp.file_path(), acl::last_serror()); return false; } if (!delimeter_.empty()) { if (add_boundary(fp) == false) return false; } if (add_body(fp) == false) return false; if (delimeter_.empty()) return true; std::vector<char*>::const_iterator cit = attachs_.begin(); for (; cit != attachs_.end(); ++cit) { if (add_boundary(fp) == false) return false; if (add_attach(fp, *cit) == false) return false; } // 添加最后一个分隔符 return add_boundary(fp, true); }
// hopper is defined by 3 pillar index void add_hopper(byte p1, byte p2, byte p3, byte load) { int px[3] = {x_lookup[p1 / 7], x_lookup[p2 / 7], x_lookup[p3 / 7]}; int py[3] = {y_lookup[p1 % 7], y_lookup[p2 % 7], y_lookup[p3 % 7]}; for (int i = 0; i < 3; ++i) { add_boundary(px[i], py[i], PILLAR_RADIUS); } // manually set load if (load != DEFAULT_LOAD) { switch (boundary_num) { case HOPPER1: hoppers[0].load = load; break; case HOPPER2: hoppers[1].load = load; break; case HOPPER3: hoppers[2].load = load; break; case HOPPER4: hoppers[3].load = load; break; default: break; } } if (load != 0) ++available_hoppers; // pillar is a boundary add_boundary((px[0]+px[1]+px[2])/3, (py[0]+py[1]+py[2])/3, HOPPER_RADIUS); }
void add_corner_hoppers() { add_boundary(24,200,PILLAR_RADIUS); add_boundary(200,24,PILLAR_RADIUS); add_boundary(60,60,HOPPER_RADIUS); add_boundary(24,1400,PILLAR_RADIUS); add_boundary(1576,24,PILLAR_RADIUS); add_boundary(60,1540,HOPPER_RADIUS); available_hoppers += 2; }
void cgi_mpfd_t::parse_guts () { abuf_stat_t r = ABUF_OK; str dummy; bool inc; while (r == ABUF_OK) { OKDBG4(SVC_MPFD, CHATTER, "cgi_mpfd_t::parse_guts loop " "r=%d, state=%d", int (r), int (state)); inc = true; switch (state) { case MPFD_START: r = match_boundary (); break; case MPFD_EOL0: r = require_crlf (); break; case MPFD_KEY: r = gobble_crlf (); if (r == ABUF_OK) { if (to_start) { state = MPFD_START; to_start = false; } else state = MPFD_SEARCH; inc = false; } else if (r == ABUF_NOMATCH) { r = delimit_key (&mpfd_key); if (r == ABUF_OK) kt = mpfd_ktmap.lookup (mpfd_key); } // else a WAIT or an EOF in gobble_crlf break; case MPFD_SPC: r = abuf->skip_hws (1); cdp.reset (); break; case MPFD_VALUE: if (kt == MPFD_DISPOSITION) { OKDBG3(SVC_MPFD, CHATTER, "cgi_mpfd_t::parse_guts branch to nested " "content disposition parser"); cdp.parse (wrap (this, &cgi_mpfd_t::ext_parse_cb)); OKDBG3(SVC_MPFD, CHATTER, "cgi_mpfd_t::parse_guts return due to " "content disposition parser"); return; } else if (kt == MPFD_TYPE) { r = delimit_val (&content_typ); if (r == ABUF_OK) { if (multipart_rxx.match (content_typ)) { add_boundary (multipart_rxx[1]); to_start = true; } } } else { r = delimit_val (&dummy); } break; case MPFD_EOL1A: r = require_crlf (); break; case MPFD_EOL1B: if (kt == MPFD_DISPOSITION) { if (cdp.typ == CONTDISP_FORMDAT) { cgi_key = cdp.name; filename = cdp.filename; attach = filename; } else if (cdp.typ == CONTDISP_ATTACH) { filename = cdp.filename; attach = true; } else { r = ABUF_PARSE_ERR; } } state = MPFD_KEY; inc = false; break; case MPFD_SEARCH: r = match_boundary (&dat); if (r == ABUF_OK) { if (cgi_key) { if (attach) finsert (cgi_key, cgi_file_t (filename, content_typ, dat)); else insert (cgi_key, dat); cgi_key = NULL; } // in this case, no more boundaries } else if (r == ABUF_PARSE_ERR) { r = ABUF_OK; state = MPFD_EOF; inc = false; } break; case MPFD_SEARCH2: r = parse_2dash (); if (r == ABUF_OK) { remove_boundary (); nxt_state = MPFD_SEARCH; } else if (r == ABUF_NOMATCH) { r = ABUF_OK; nxt_state = MPFD_KEY; } break; case MPFD_SEARCH3: r = require_crlf (); if (r == ABUF_OK) { state = nxt_state; inc = false; } break; case MPFD_EOF: r = abuf->skip_ws (); break; default: break; } if (r == ABUF_OK && inc) MPFD_INC_STATE; } OKDBG4(SVC_MPFD, CHATTER, "cgi_mpfd_t::parse_guts exit loop " "r=%d, state=%d", int (r), int (state)); switch (r) { case ABUF_EOF: int rc; if (state == MPFD_EOF) { rc = HTTP_OK; } else { rc = HTTP_UNEXPECTED_EOF; warn ("mpfd EOF in state %d after %d bytes read\n", int (state), abuf ? abuf->get_ccnt () : -1); } finish_parse (rc); break; case ABUF_PARSE_ERR: finish_parse (HTTP_BAD_REQUEST); break; default: break; } }