From da8c12625f3f168b4fa750e9ce176f1275fb06fc Mon Sep 17 00:00:00 2001
From: edgrif <edgrif>
Date: Wed, 29 Oct 2008 16:11:18 +0000
Subject: [PATCH] fix whole load of stuff that was broken, still more to do.

---
 src/zmapServer/file/fileServer.c   | 179 ++++++++++++++++++++---------
 src/zmapServer/file/fileServer_P.h |   6 +-
 2 files changed, 128 insertions(+), 57 deletions(-)

diff --git a/src/zmapServer/file/fileServer.c b/src/zmapServer/file/fileServer.c
index 3dd24a472..814bddb61 100755
--- a/src/zmapServer/file/fileServer.c
+++ b/src/zmapServer/file/fileServer.c
@@ -30,9 +30,9 @@
  *              
  * Exported functions: See ZMap/zmapServerPrototype.h
  * HISTORY:
- * Last edited: Aug  1 14:06 2008 (edgrif)
+ * Last edited: Oct 17 14:41 2008 (edgrif)
  * Created: Fri Sep 10 18:29:18 2004 (edgrif)
- * CVS info:   $Id: fileServer.c,v 1.31 2008-09-24 14:57:56 edgrif Exp $
+ * CVS info:   $Id: fileServer.c,v 1.32 2008-10-29 16:11:18 edgrif Exp $
  *-------------------------------------------------------------------
  */
 
@@ -72,10 +72,11 @@ static gboolean createConnection(void **server_out,
                                  char *version_str, int timeout) ;
 
 static ZMapServerResponseType openConnection(void *server) ;
+static ZMapServerResponseType getInfo(void *server, char **database_path) ;
+static ZMapServerResponseType getFeatureSetNames(void *server, GList **feature_sets_out, GList **required_styles) ;
 static ZMapServerResponseType getStyles(void *server, GData **styles_out) ;
 static ZMapServerResponseType haveModes(void *server, gboolean *have_mode) ;
 static ZMapServerResponseType getSequences(void *server_in, GList *sequences_inout) ;
-static ZMapServerResponseType getFeatureSets(void *server, GList **feature_sets_out, GList **required_styles) ;
 static ZMapServerResponseType setContext(void *server,  ZMapFeatureContext feature_context) ;
 static ZMapServerResponseType getFeatures(void *server_in, ZMapFeatureContext feature_context_out) ;
 static ZMapServerResponseType getContextSequence(void *server_in, ZMapFeatureContext feature_context_out) ;
@@ -90,8 +91,7 @@ static gboolean sequenceRequest(FileServer server, ZMapGFFParser parser, GString
 				ZMapFeatureBlock feature_block) ;
 static void setLastErrorMsg(FileServer server, GError **gff_file_err_inout) ;
 
-
-
+static gboolean getServerInfo(FileServer server, char **database_path_out) ;
 
 
 
@@ -103,7 +103,8 @@ void fileGetServerFuncs(ZMapServerFuncs file_funcs)
   file_funcs->global_init = globalInit ;
   file_funcs->create = createConnection ;
   file_funcs->open = openConnection ;
-  file_funcs->feature_set_names = getFeatureSets ;
+  file_funcs->get_info = getInfo ;
+  file_funcs->feature_set_names = getFeatureSetNames ;
   file_funcs->get_styles = getStyles ;
   file_funcs->have_modes = haveModes ;
   file_funcs->get_sequence = getSequences ;
@@ -209,6 +210,26 @@ static ZMapServerResponseType openConnection(void *server_in)
 }
 
 
+static ZMapServerResponseType getInfo(void *server_in, char **database_path)
+{
+  ZMapServerResponseType result = ZMAP_SERVERRESPONSE_REQFAIL ;
+  FileServer server = (FileServer)server_in ;
+
+
+  if (getServerInfo(server, database_path))
+    {
+      result = ZMAP_SERVERRESPONSE_OK ;
+    }
+  else
+    {
+      result = ZMAP_SERVERRESPONSE_REQFAIL ;
+      ZMAPSERVER_LOG(Warning, FILE_PROTOCOL_STR, server->file_path,
+		     "Could not get server info because: %s", server->last_err_msg) ;
+    }
+
+  return result ;
+}
+
 
 /* We cannot parse the styles from a gff file, gff simply doesn't have display styles so we
  * just return "unsupported", so if this function is called it will alert the caller that
@@ -222,7 +243,7 @@ static ZMapServerResponseType getStyles(void *server_in, GData **styles_out)
 
   zMapAssert(server) ;
 
-  server->last_err_msg = g_strdup("Styles cannot be read from a GFF file.") ;
+  server->last_err_msg = g_strdup("Reading styles from a GFF file is not supported.") ;
   ZMAPSERVER_LOG(Critical, FILE_PROTOCOL_STR, server->file_path,
 		 "%s", server->last_err_msg) ;
 
@@ -233,17 +254,15 @@ static ZMapServerResponseType getStyles(void *server_in, GData **styles_out)
 
 
 /* GFF File styles do not include a mode (e.g. transcript etc) so this function
- * always returns FALSE.
+ * always returns unsupported.
  */
 static ZMapServerResponseType haveModes(void *server_in, gboolean *have_mode)
 {
-  ZMapServerResponseType result = ZMAP_SERVERRESPONSE_OK ;
+  ZMapServerResponseType result = ZMAP_SERVERRESPONSE_UNSUPPORTED ;
 #ifdef ED_G_NEVER_INCLUDE_THIS_CODE
   FileServer server = (FileServer)server_in ;
 #endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
 
-  *have_mode = FALSE ;
-
   return result ;
 }
 
@@ -263,18 +282,37 @@ static ZMapServerResponseType getSequences(void *server_in, GList *sequences_ino
  * will alert the caller that something has gone wrong.
  * 
  *  */
-static ZMapServerResponseType getFeatureSets(void *server_in, GList **feature_sets_out, GList **required_styles)
+static ZMapServerResponseType getFeatureSetNames(void *server_in,
+						 GList **feature_sets_inout, GList **required_styles_out)
 {
   ZMapServerResponseType result = ZMAP_SERVERRESPONSE_REQFAIL ;
   FileServer server = (FileServer)server_in ;
+  GList *feature_sets = NULL ;
 
   zMapAssert(server) ;
 
+
+#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
   server->last_err_msg = g_strdup("Feature Sets cannot be read from a GFF file.") ;
   ZMAPSERVER_LOG(Critical, FILE_PROTOCOL_STR, server->file_path,
 		 "%s", server->last_err_msg) ;
 
   result = ZMAP_SERVERRESPONSE_UNSUPPORTED ;
+#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
+
+  /* We should check feature_sets_in against those found in file.....the below is a total hack... */
+
+
+  feature_sets = g_list_append(feature_sets, GINT_TO_POINTER(g_quark_from_string("utr"))) ;
+  feature_sets = g_list_append(feature_sets, GINT_TO_POINTER(g_quark_from_string("coding_transcript"))) ;
+  
+  result = ZMAP_SERVERRESPONSE_OK ;
+
+
+  *feature_sets_inout = feature_sets ;
+
+  *required_styles_out = g_list_copy(feature_sets) ;
+
 
   return result ;
 }
@@ -309,7 +347,7 @@ static ZMapServerResponseType getFeatures(void *server_in, ZMapFeatureContext fe
   gsize terminator_pos = 0 ;
   GError *gff_file_err = NULL ;
   ZMapGFFHeader header ;
-
+  GError *error = NULL ;
 
 #ifdef ED_G_NEVER_INCLUDE_THIS_CODE
   {
@@ -335,66 +373,84 @@ static ZMapServerResponseType getFeatures(void *server_in, ZMapFeatureContext fe
   get_features.gff_line = g_string_sized_new(2000) ;	    /* Probably not many lines will be >
 							       2k chars. */
 
-
+  /* Read the header, needed for feature coord range. */
   while ((status = g_io_channel_read_line_string(server->gff_file, get_features.gff_line,
 						 &terminator_pos,
 						 &gff_file_err)) == G_IO_STATUS_NORMAL)
     {
-      *(get_features.gff_line->str + terminator_pos) = '\0' ; /* Remove terminating newline. */
+      gboolean done_header = FALSE ;
 
+      *(get_features.gff_line->str + terminator_pos) = '\0' ; /* Remove terminating newline. */
 
-      if (!zMapGFFParseHeader(get_features.parser, get_features.gff_line->str))
+      if (zMapGFFParseHeader(get_features.parser, get_features.gff_line->str, &done_header))
 	{
-	  GError *error = zMapGFFGetError(get_features.parser) ;
-
-	  if (!error && (header = zMapGFFGetHeader(get_features.parser)))
-	    {
-	      /* Header finished..ugh poor interface.... */
-	      break ;
-	    }
-
-	  if (!error)
-	    {
-	      server->last_err_msg =
-		g_strdup_printf("zMapGFFParseLine() failed with no GError for line %d: %s",
-				zMapGFFGetLineNumber(get_features.parser), get_features.gff_line->str) ;
-	      ZMAPSERVER_LOG(Critical, FILE_PROTOCOL_STR, server->file_path,
-			     "%s", server->last_err_msg) ;
-
-	      get_features.result = ZMAP_SERVERRESPONSE_REQFAIL ;
-	    }
+	  if (done_header)
+	    break ;
 	  else
+	    get_features.gff_line = g_string_truncate(get_features.gff_line, 0) ;
+							    /* Reset line to empty. */
+	}
+      else
+	{
+	  if (!done_header)
 	    {
-	      /* If the error was serious we stop processing and return the error,
-	       * otherwise we just log the error. */
-	      if (zMapGFFTerminated(get_features.parser))
+	      error = zMapGFFGetError(get_features.parser) ;
+
+	      if (!error)
 		{
-		  get_features.result = ZMAP_SERVERRESPONSE_REQFAIL ;
-		  server->last_err_msg = g_strdup_printf("%s", error->message) ;
+		  /* SHOULD ABORT HERE.... */
+		  server->last_err_msg =
+		    g_strdup_printf("zMapGFFParseLine() failed with no GError for line %d: %s",
+				    zMapGFFGetLineNumber(get_features.parser), get_features.gff_line->str) ;
+		  ZMAPSERVER_LOG(Critical, FILE_PROTOCOL_STR, server->file_path,
+				 "%s", server->last_err_msg) ;
 		}
 	      else
 		{
-		  ZMAPSERVER_LOG(Warning, FILE_PROTOCOL_STR, server->file_path,
-				 "%s", error->message) ;
+		  /* If the error was serious we stop processing and return the error,
+		   * otherwise we just log the error. */
+		  if (zMapGFFTerminated(get_features.parser))
+		    {
+		      get_features.result = ZMAP_SERVERRESPONSE_REQFAIL ;
+		      server->last_err_msg = g_strdup_printf("%s", error->message) ;
+		    }
+		  else
+		    {
+		      server->last_err_msg =
+			g_strdup_printf("zMapGFFParseHeader() failed for line %d: %s",
+					zMapGFFGetLineNumber(get_features.parser), get_features.gff_line->str) ;
+		      ZMAPSERVER_LOG(Critical, FILE_PROTOCOL_STR, server->file_path,
+				     "%s", server->last_err_msg) ;
+		    }
 		}
+	      get_features.result = ZMAP_SERVERRESPONSE_REQFAIL ;
 	    }
 
 	  break ;
 	}
-
-      get_features.gff_line = g_string_truncate(get_features.gff_line, 0) ;
-							    /* Reset line to empty. */
     }
 
+  if (get_features.result == ZMAP_SERVERRESPONSE_OK)
+    {
+      header = zMapGFFGetHeader(get_features.parser) ;
+
+      addMapping(feature_context, header) ;
 
-  addMapping(feature_context, header) ;
+      zMapGFFFreeHeader(header) ;
 
-  zMapGFFFreeHeader(header) ;
 
+      /* Fetch all the alignment blocks for all the sequences, this all hacky right now as really.
+       * we would have to parse and reparse the file....can be done but not needed this second. */
+      g_hash_table_foreach(feature_context->alignments, eachAlignment, (gpointer)&get_features) ;
 
-  /* Fetch all the alignment blocks for all the sequences, this all hacky right now as really.
-   * we would have to parse and reparse the file....can be done but not needed this second. */
-  g_hash_table_foreach(feature_context->alignments, eachAlignment, (gpointer)&get_features) ;
+      {
+	GError *error = NULL ;
+      
+	zMapFeatureDumpStdOutFeatures(feature_context, &error) ;
+	
+      }
+
+    }
 
 
   /* Clear up. */
@@ -579,7 +635,7 @@ static gboolean sequenceRequest(FileServer server, ZMapGFFParser parser, GString
   gsize terminator_pos = 0 ;
   gboolean free_on_destroy = FALSE ;
   GError *gff_file_err = NULL ;
-
+  gboolean first ;
 
   /* Tempting to check that block is inside features_start/end, but it may be a different
    * sequence....we don't really deal with this...  */
@@ -591,11 +647,13 @@ static gboolean sequenceRequest(FileServer server, ZMapGFFParser parser, GString
 			      feature_block->block_to_sequence.q1,
 			      feature_block->block_to_sequence.q2) ;
 
-
-  while ((status = g_io_channel_read_line_string(server->gff_file, gff_line, &terminator_pos,
-						 &gff_file_err)) == G_IO_STATUS_NORMAL)
+  first = TRUE ;
+  do
     {
-      *(gff_line->str + terminator_pos) = '\0' ;	    /* Remove terminating newline. */
+      if (first)
+	first = FALSE ;
+      else
+	*(gff_line->str + terminator_pos) = '\0' ;	    /* Remove terminating newline. */
 
 
       if (!zMapGFFParseLine(parser, gff_line->str))
@@ -630,7 +688,9 @@ static gboolean sequenceRequest(FileServer server, ZMapGFFParser parser, GString
 	}
 
       gff_line = g_string_truncate(gff_line, 0) ;   /* Reset line to empty. */
-    }
+
+    } while ((status = g_io_channel_read_line_string(server->gff_file, gff_line, &terminator_pos,
+						     &gff_file_err)) == G_IO_STATUS_NORMAL) ;
 
 
   /* If we reached the end of the file then all is fine, so return features... */
@@ -660,3 +720,12 @@ static gboolean sequenceRequest(FileServer server, ZMapGFFParser parser, GString
 }
 
 
+static gboolean getServerInfo(FileServer server, char **database_path_out)
+{
+  gboolean result = FALSE ;
+
+  result = TRUE ;
+  *database_path_out = g_strdup(server->file_path) ;
+
+  return result ;
+}
diff --git a/src/zmapServer/file/fileServer_P.h b/src/zmapServer/file/fileServer_P.h
index d328e6b03..68d03d029 100755
--- a/src/zmapServer/file/fileServer_P.h
+++ b/src/zmapServer/file/fileServer_P.h
@@ -26,9 +26,9 @@
  *              of the server code.
  *              
  * HISTORY:
- * Last edited: Jul 26 09:03 2005 (edgrif)
+ * Last edited: Oct 14 14:59 2008 (edgrif)
  * Created: Fri Sep 10 18:42:18 2004 (edgrif)
- * CVS info:   $Id: fileServer_P.h,v 1.5 2006-11-08 09:24:31 edgrif Exp $
+ * CVS info:   $Id: fileServer_P.h,v 1.6 2008-10-29 16:11:18 edgrif Exp $
  *-------------------------------------------------------------------
  */
 #ifndef FILE_SERVER_P_H
@@ -46,6 +46,8 @@ typedef struct _FileServerStruct
   gchar *file_path ;
   GIOChannel* gff_file ;
 
+  char *styles_file ;
+
   gboolean error ;					    /* TRUE if any error occurred. */
   char *last_err_msg ;
 
-- 
GitLab