/* Author: Ram Samudrala (me@ram.org) * Version: O1.0 * Detail: * November 22, 1996; Copyright (c) 1995 by Ram Samudrala. * * See the URL above for terms of use and general help. */ #include "cgi_common.h" #include "cgi_defines.h" #include "sc_defines.h" #include "cgi_cookies.h" #include "cgi_display.h" #include "cgi_error_handlers.h" #include "display_item_list.h" #include "items.h" #include "search.h" int content_type_displayed = FALSE; void add_to_order(char *args[]); void add_to_order_string(char order_string[], char *args[]); void display_order(item items[], int checkout); void clear_order(char url[]); void display_order_header(int checkout); void display_order_item(char name[], int quantity, char desc[], double price, int checkout); void display_order_trailer(int checkout); void display_all_items(item items[]); /******************************************************************/ int main(int argc, char *argv[]) { if (strcmp(getenv("REQUEST_METHOD"), "POST") == 0) /* search */ search(); else { item items[MAX_ITEMS]; switch(argc) { case 1: read_items(DEFAULT_ITEMS_FILE, items); display_order(items, FALSE); break; case 2: if (strcmp(argv[1], "list") == 0) { read_items(DEFAULT_ITEMS_FILE, items); display_order(items, FALSE); } else if (strcmp(argv[1], "checkout") == 0) { read_items(DEFAULT_ITEMS_FILE, items); display_order(items, TRUE); } else if (strcmp(argv[1], "catalog") == 0) { read_items(DEFAULT_ITEMS_FILE, items); display_all_items(items); } else display_error("main(): unrecognised argument!"); break; case 3: if (strcmp(argv[1], "clear") == 0) clear_order(argv[2]); else display_error("main(): unrecognised argument!"); break; case 4: add_to_order(argv); break; default: display_error("main(): unrecognised argument!"); } } return 1; } /******************************************************************/ void clear_order(char url[]) { clear_cookie(ORDER_COOKIE_NAME, DEFAULT_PATH, url); return; } /******************************************************************/ void display_order(item items[], int checkout) { char cookie_string[ORDER_COOKIE_STRING_LENGTH]; char order_string[ORDER_COOKIE_STRING_LENGTH], *cp, *cptok; char desc[ITEM_DESCRIPTION_STRING_LENGTH]; char name[ITEM_DESCRIPTION_STRING_LENGTH], *cp_delim; int quantity; double price, shipping_price; if (getenv("HTTP_COOKIE") != NULL) { sprintf(cookie_string, "%s", getenv("HTTP_COOKIE")); cp = strstr(cookie_string, "order="); if (cp != NULL) { display_order_header(checkout); sscanf(cp, "order=%s", order_string); if ((cptok = strtok(order_string, "|")) != NULL) { if ((cp_delim = strchr(cptok, (int) SEPARATOR)) == NULL) display_error("display_order(): separator not found!"); *cp_delim = '\0'; strcpy(name, cptok); cp_delim++; quantity = atoi(cp_delim); get_item_desc_price(name, quantity, &price, &shipping_price, desc, items); display_order_item(name, quantity, desc, price, checkout); } while ((cptok = strtok(NULL, "|")) != NULL) { if ((cp_delim = strchr(cptok, (int) SEPARATOR)) == NULL) display_error("display_order(): separator not found!"); *cp_delim = '\0'; strcpy(name, cptok); cp_delim++; quantity = atoi(cp_delim); get_item_desc_price(name, quantity, &price, &shipping_price, desc, items); display_order_item(name, quantity, desc, price, checkout); } display_order_trailer(checkout); } else display_error("display_order(): order cookie not found!"); } else display_error("display_order(): no cookie exists (no items selected)!"); return; } /******************************************************************/ void add_to_order(char *args[]) { char cookie_string[ORDER_COOKIE_STRING_LENGTH], order_string[ORDER_COOKIE_STRING_LENGTH], *cp; if (getenv("HTTP_COOKIE") != NULL) { sprintf(cookie_string, "%s", getenv("HTTP_COOKIE")); cp = strstr(cookie_string, "order="); if (cp != NULL) { sscanf(cp, "order=%s", order_string); add_to_order_string(order_string, args); set_cookie(ORDER_COOKIE_NAME, order_string, DEFAULT_PATH, DEFAULT_EXPIRES, args[3]); return; } } /* Order cookie doesn't exist. Could be a problem, but create a new order anyway. */ strcpy(order_string, "|"); add_to_order_string(order_string, args); set_cookie(ORDER_COOKIE_NAME, order_string, DEFAULT_PATH, DEFAULT_EXPIRES, args[3]); return; } /******************************************************************/ void add_to_order_string(char order_string[], char *args[]) { char tmp_string[ORDER_COOKIE_STRING_LENGTH]; sprintf(tmp_string, "%s%c%s|", args[1], SEPARATOR, args[2]); strcat(order_string, tmp_string); return; } /******************************************************************/ void display_order_header(int checkout) { if (checkout) { display_content_type("Checking out..."); printf("

Checking out...

\n"); printf("

Here is a list of items you have in your shopping cart.\n"); printf("Leaving the quantity field blank will remove that item from the cart.\n"); printf("Once you've filled in the requested information, you can test your order\n"); printf("to make sure the items listed are what you want and all the other information\n"); printf("is entered correctly. If everything looks okay, you can submit the order.\n"); printf("You will receive conformation of your order within 48 hours. If you have any\n"); printf("problems, please report them to %s.

\n", CARETAKER, CARETAKER); printf("
\n"); printf("
\n", DEFAULT_URL, ORDER_PROCESSING_SCRIPT); printf("

Name: \n"); printf("E-mail:

\n"); printf("

Street:

\n"); printf("

City: \n"); printf("State: \n"); printf("Zip:

\n"); printf("

Check if\n"); printf("shipping address is outside the U.S.

\n"); printf("

Specify or change quantity in box for the items you wish to order:

\n"); printf("\n"); } else { display_content_type("List of items in shopping cart"); printf("

List of items in shopping cart

\n"); printf("

You will be given an option to change the quantity of, or remove,\n"); printf("items you ordered when you check out.

\n", SHOPPER_PROCESSING_SCRIPT); printf("
\n"); } printf("\n"); if (!checkout) printf("\n"); else printf("\n"); return; } /******************************************************************/ void display_order_item(char name[], int quantity, char desc[], double price, int checkout) { if (!checkout) printf("\n", desc, quantity, price); else printf("\n", name, DEFAULT_INPUT_FIELD_SIZE, quantity, desc, price); return; } /******************************************************************/ void display_order_trailer(int checkout) { printf("
Item Quantity Price
Item Price
%s %5d $%5.2f
%s $%5.2f
\n"); if (checkout) { printf("\n"); printf("

\n"); printf("TEST order or \n"); printf("SUBMIT order.

\n"); printf("

\n"); printf("
\n"); } display_signature(SIGNATURE_FILE); return; } /******************************************************************/ void display_all_items(item items[]) { display_order_header(TRUE); display_item_list(items); display_order_trailer(TRUE); return; } /******************************************************************/