064a6ba7c9f9e4a2055cd8363f6128ac475c576e
galt
  Fri Feb 25 15:30:32 2011 -0800
squashed my dev branch bigNetErrDisplay to test making code review easier; this code helps hgTracks display big network warnings and errors with a yellow background; it supports bigWig, bigBed, bam, and multiWig; In the case of multiWig, it can only draw the yellow background once at the beginning, and is limited to only drawing the first track that has a network error since overlapping multiple error messages would be unreadable
diff --git src/hg/hgTracks/bigWigTrack.c src/hg/hgTracks/bigWigTrack.c
index 9a36e74..a5771db 100644
--- src/hg/hgTracks/bigWigTrack.c
+++ src/hg/hgTracks/bigWigTrack.c
@@ -1,34 +1,39 @@
 /* bigWigTrack - stuff to handle loading and display of bigWig type tracks in browser.   */
 
 #include "common.h"
 #include "hash.h"
 #include "linefile.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "hgTracks.h"
 #include "localmem.h"
 #include "wigCommon.h"
 #include "bbiFile.h"
 #include "bigWig.h"
-
-static char const rcsid[] = "$Id: bigWigTrack.c,v 1.11 2010/05/11 01:43:26 kent Exp $";
+#include "errCatch.h"
+#include "container.h"
+#include "bigWarn.h"
 
 static void bigWigDrawItems(struct track *tg, int seqStart, int seqEnd,
 	struct hvGfx *hvg, int xOff, int yOff, int width,
 	MgFont *font, Color color, enum trackVisibility vis)
 {
+/* protect against temporary network error */
+struct errCatch *errCatch = errCatchNew();
+if (errCatchStart(errCatch))
+    {
 /* Allocate predraw area. */
 int preDrawZero, preDrawSize;
 struct preDrawContainer *preDrawList = NULL;
 
 /* Get summary info from bigWig */
 int summarySize = width;
 struct bbiSummaryElement *summary;
 AllocArray(summary, summarySize);
 
 struct bbiFile *bbiFile ;
 for(bbiFile = tg->bbiFile; bbiFile ; bbiFile = bbiFile->next)
     {
     struct preDrawContainer *preDrawContainer;
     struct preDrawElement *preDraw = initPreDraw(width, &preDrawSize, &preDrawZero);
     AllocVar(preDrawContainer);
@@ -53,56 +58,75 @@
     }
 
 /* Call actual graphing routine. */
 wigDrawPredraw(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis,
 	       preDrawList, preDrawZero, preDrawSize, &tg->graphUpperLimit, &tg->graphLowerLimit);
 
 struct preDrawContainer *nextContain;
 for(; preDrawList ; preDrawList = nextContain)
     {
     nextContain = preDrawList->next;
     freeMem(preDrawList->preDraw);
     freeMem(preDrawList);
     }
 freeMem(summary);
 }
-
-static void bigWigLoadItems(struct track *tg)
-/* Fill up tg->items with bedGraphItems derived from a bigWig file */
+errCatchEnd(errCatch);
+if (errCatch->gotError)
 {
-char *extTableString = trackDbSetting(tg->tdb, "extTable");
+    tg->networkErrMsg = cloneString(errCatch->message->string);
+    bigDrawWarning(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis);
+    }
+errCatchFree(&errCatch);
+}
 
-if (extTableString != NULL)
+static void bigWigOpenCatch(struct track *tg, char *fileName)
+/* Try to open big wig file, store error in track struct */
+{
+/* protect against temporary network error */
+struct errCatch *errCatch = errCatchNew();
+if (errCatchStart(errCatch))
     {
-    // if there's an extra table, read this one in too
-    struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
-    char *fileName = bbiNameFromSettingOrTable(tg->tdb, conn, tg->table);
     struct bbiFile *bbiFile = bigWigFileOpen(fileName);
     slAddHead(&tg->bbiFile, bbiFile);
+    }
+errCatchEnd(errCatch);
+if (errCatch->gotError)
+    {
+    tg->networkErrMsg = cloneString(errCatch->message->string);
+    tg->drawItems = bigDrawWarning;
+    if (!sameOk(parentContainerType(tg), "multiWig"))
+	tg->totalHeight = bigWarnTotalHeight;
+    }
+errCatchFree(&errCatch);
+}
 
-    fileName = bbiNameFromSettingOrTable(tg->tdb, conn, extTableString);
-    bbiFile = bigWigFileOpen(fileName);
-    slAddHead(&tg->bbiFile, bbiFile);
 
-    hFreeConn(&conn);
-    }
-else
+static void bigWigLoadItems(struct track *tg)
+/* Fill up tg->items with bedGraphItems derived from a bigWig file */
     {
+char *extTableString = trackDbSetting(tg->tdb, "extTable");
+
     if (tg->bbiFile == NULL)
 	{
 	/* Figure out bigWig file name. */
 	struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
 	char *fileName = bbiNameFromSettingOrTable(tg->tdb, conn, tg->table);
-	tg->bbiFile = bigWigFileOpen(fileName);
-	hFreeConn(&conn);
+    bigWigOpenCatch(tg, fileName);
+    // if there's an extra table, read this one in too
+    if (extTableString != NULL)
+	{
+	fileName = bbiNameFromSettingOrTable(tg->tdb, conn, extTableString);
+        bigWigOpenCatch(tg, fileName);
 	}
+    hFreeConn(&conn);
     }
 }
 
 void bigWigMethods(struct track *track, struct trackDb *tdb, 
 	int wordCount, char *words[])
 /* Set up bigWig methods. */
 {
 bedGraphMethods(track, tdb, wordCount, words);
 track->loadItems = bigWigLoadItems;
 track->drawItems = bigWigDrawItems;
 }