08996db0236137b9cf9b3893d74e7aae41873ab2
braney
Thu Apr 14 12:33:46 2011 -0700
fixed up the forms to act a little more rationally... added error catching so new hubs that can't be opened don't errAbort
diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c
index 3aa0b1b..8ba1ecb 100644
--- src/hg/hgHubConnect/hgHubConnect.c
+++ src/hg/hgHubConnect/hgHubConnect.c
@@ -1,338 +1,359 @@
/* hgHubConnect - the CGI web-based program to select track data hubs to connect with. */
#include "common.h"
#include "hash.h"
#include "linefile.h"
#include "errabort.h"
#include "errCatch.h"
#include "hCommon.h"
#include "dystring.h"
#include "jksql.h"
#include "cheapcgi.h"
#include "htmshell.h"
#include "hdb.h"
#include "hui.h"
#include "cart.h"
#include "dbDb.h"
#include "web.h"
#include "trackHub.h"
#include "hubConnect.h"
#include "trashDir.h"
#include "hPrint.h"
#define TEXT_ENTRY_ROWS 7
#define TEXT_ENTRY_COLS 73
#define CONFIG_ENTRY_ROWS 3
#define SAVED_LINE_COUNT 50
#define HUB_CUSTOM_TEXT_ALT_VAR "hghub_customText"
#define HUB_CUSTOM_FILE_VAR "hghub.customFile"
#define HUB_UPDATED_ID "hghub_updatedId"
#define hgHubDataText HUB_CUSTOM_TEXT_ALT_VAR
#define hgHubDataFile HUB_CUSTOM_FILE_VAR
#define hgHubUpdatedId HUB_UPDATED_ID
#define hgHub "hgHub_" /* prefix for all control variables */
#define hgHubDo hgHub "do_" /* prefix for all commands */
#define hgHubDoAdd hgHubDo "add"
struct cart *cart; /* The user's ui state. */
struct hash *oldVars = NULL;
static char *destUrl = "../cgi-bin/hgTracks";
static char *pageTitle = "Import Tracks from Data Hubs";
char *database = NULL;
char *organism = NULL;
boolean nameInCommaList(char *name, char *commaList)
/* Return TRUE if name is in comma separated list. */
{
if (commaList == NULL)
return FALSE;
int nameLen = strlen(name);
for (;;)
{
char c = *commaList;
if (c == 0)
return FALSE;
if (memcmp(name, commaList, nameLen) == 0)
{
c = commaList[nameLen];
if (c == 0 || c == ',')
return TRUE;
}
commaList = strchr(commaList, ',');
if (commaList == NULL)
return FALSE;
commaList += 1;
}
}
void hgHubConnectPrivate()
/* Put up the list of private hubs and other controls for the page. */
{
-printf("
\n");
}
void hgHubConnectPublic()
/* Put up the list of external hubs and other controls for the page. */
{
-destUrl = cartUsualString(cart, hgHubConnectCgiDestUrl, destUrl);
-printf("\n");
hDisconnectCentral(&conn);
}
static void addIntro()
{
+printf("Enter URL to remote hub.
\n");
}
void makeClearButton(char *field)
/* UI button that clears a text field */
{
char javascript[1024];
safef(javascript, sizeof javascript,
"document.mainForm.%s.value = '';", field);
cgiMakeOnClickButton(javascript, " Clear ");
}
void addPrivateHubForm(struct hubConnectStatus *hub, char *err)
/* display UI for adding private hubs by URL or pasting data */
{
getDbAndGenome(cart, &database, &organism, oldVars);
boolean gotClade = FALSE;
boolean isUpdateForm = FALSE;
if (hub)
{
isUpdateForm = TRUE;
}
else
/* add form needs clade for assembly menu */
gotClade = hGotClade();
/* main form */
printf("");
}
void helpPrivateHub()
{
+printf("Private hubs are constructed the same way as public hubs, but they "
+ "aren't listed in hgcentral
\n");
}
void doAddPrivateHub(struct cart *theCart, char *err)
/* Write header and body of html page. */
{
cartWebStart(cart, database, "Add Private Hub");
addPrivateHubForm(NULL, err);
helpPrivateHub();
cartWebEnd(cart);
}
void hubSaveInCart(struct cart *cart, struct hubConnectStatus *hub)
{
char hubName[1024];
char *oldHubTrashName = cartOptionalString(cart, hubFileVar());
static struct tempName tn;
trashDirFile(&tn, "hub", "hub_", ".txt");
char *hubTrashName = tn.forCgi;
FILE *f = mustOpen(hubTrashName, "w");
if (oldHubTrashName == NULL)
{
hub->id = -1;
}
else
{
struct lineFile *lf = lineFileOpen(oldHubTrashName, TRUE);
int lineSize;
char *line;
int count = 1;
while (lineFileNext(lf, &line, &lineSize))
{
count++;
fprintf(f, "%s\n", line);
}
lineFileClose(&lf);
hub->id = -count;
}
hubWriteToFile(f, hub);
carefulClose(&f);
safef(hubName, sizeof(hubName), "%s%d", hgHubConnectHubVarPrefix, hub->id);
cartSetString(cart, hubName, "1");
cartSetString(cart, hubFileVar(), hubTrashName);
}
void checkForNewHub(struct cart *cart)
{
char *url = cartOptionalString(cart, hgHubDataText);
if (url != NULL)
{
struct hubConnectStatus *hub = NULL;
- struct trackHub *tHub = trackHubOpen(url, "1");
+ struct trackHub *tHub = NULL;
+
+ struct errCatch *errCatch = errCatchNew();
+ if (errCatchStart(errCatch))
+ tHub = trackHubOpen(url, "1");
+ errCatchEnd(errCatch);
+ if (errCatch->gotError)
+ {
+ warn(errCatch->message->string);
+ return;
+ }
+ errCatchFree(&errCatch);
AllocVar(hub);
hub->hubUrl = cloneString(url);
hub->errorMessage = "";
hub->shortLabel = tHub->shortLabel;
hub->longLabel = tHub->longLabel;
hub->dbCount = 0;
AllocArray(hub->dbArray, 1);
hub->dbArray[0] = database;
hubSaveInCart(cart, hub);
cartRemove(cart, hgHubDataText);
}
}
void doMiddle(struct cart *theCart)
/* Write header and body of html page. */
{
cart = theCart;
setUdcCacheDir();
if (cartVarExists(cart, hgHubDoAdd))
doAddPrivateHub(cart, NULL);
else
{
cartWebStart(cart, NULL, pageTitle);
checkForNewHub(cart);
+ printf("");
+
+ makeNewHubButton();
}
cartWebEnd();
}
-char *excludeVars[] = {"Submit", "submit", "hc_one_url", hgHubConnectCgiDestUrl, NULL};
+char *excludeVars[] = {"Submit", "submit", "hc_one_url", hgHubConnectCgiDestUrl, hgHubDoAdd, NULL};
int main(int argc, char *argv[])
/* Process command line. */
{
oldVars = hashNew(10);
cgiSpoof(&argc, argv);
cartEmptyShell(doMiddle, hUserCookie(), excludeVars, oldVars);
return 0;
}