TSP: The Transport Sample Protocol



Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

gdisp_providers.c

Go to the documentation of this file.
00001 
00043 /*
00044  * System includes.
00045  */
00046 #include <stdio.h>
00047 #include <stdlib.h>
00048 #include <assert.h>
00049 #include <string.h>
00050 
00051 
00052 /*
00053  * GDISP+ includes.
00054  */
00055 #include "gdisp_kernel.h"
00056 #include "gdisp_prototypes.h"
00057 
00058 
00059 /*
00060  --------------------------------------------------------------------
00061                              STATIC ROUTINES
00062  --------------------------------------------------------------------
00063 */
00064 
00065 
00066 static gchar*
00067 gdisp_providerStatusToString ( ThreadStatus_T status,
00068                                guint          *colorId )
00069 {
00070 
00071   gchar *sStatus = (gchar*)NULL;
00072 
00073   switch (status) {
00074 
00075   case GD_THREAD_STOPPED :
00076     sStatus  = "STOPPED";
00077     *colorId = _WHITE_;
00078     break;
00079 
00080   case GD_THREAD_STARTING :
00081     sStatus = "STARTING...";
00082     *colorId = _ORANGE_;
00083     break;
00084 
00085   case GD_THREAD_WARNING :
00086     sStatus = "WARNING";
00087     *colorId = _ORANGE_;
00088     break;
00089 
00090   case GD_THREAD_REQUEST_SAMPLE_ERROR :
00091     sStatus = "REQUEST SAMPLE";
00092     *colorId = _RED_;
00093     break;
00094 
00095   case GD_THREAD_SAMPLE_INIT_ERROR :
00096     sStatus = "SAMPLE INIT";
00097     *colorId = _RED_;
00098     break;
00099 
00100   case GD_THREAD_SAMPLE_DESTROY_ERROR :
00101     sStatus = "SAMPLE DESTROY";
00102     *colorId = _RED_;
00103     break;
00104 
00105   case GD_THREAD_ERROR :
00106     sStatus = "THREAD ERROR";
00107     *colorId = _RED_;
00108     break;
00109 
00110   case GD_THREAD_RUNNING :
00111     sStatus = "RUNNING";
00112     *colorId = _GREEN_;
00113     break;
00114 
00115   default :
00116     sStatus = "UNKNOWN";
00117     *colorId = _GREY_;
00118     break;
00119 
00120   }
00121 
00122   return sStatus;
00123 
00124 }
00125 
00126 
00127 /*
00128  *  Graphically show the status of all providers.
00129  */
00130 static void
00131 gdisp_poolProviderThreadStatus ( Kernel_T *kernel )
00132 {
00133 
00134   GList      *providerItem      =      (GList*)NULL;
00135   Provider_T *provider          = (Provider_T*)NULL;
00136   guint       providerLoad      = 0;
00137   gchar       rowBuffer[128];
00138   guint       bgColorId         = _WHITE_;
00139 
00140 
00141   /*
00142    * Loop over all available providers into the list.
00143    */
00144   providerItem = g_list_first(kernel->providerList);
00145   while (providerItem != (GList*)NULL) {
00146 
00147     provider = (Provider_T*)providerItem->data;
00148 
00149     gtk_clist_set_text(GTK_CLIST(provider->pCList),
00150                        1 /* status row */,
00151                        1 /* information */,
00152                gdisp_providerStatusToString(provider->pSamplingThreadStatus,
00153                                             &bgColorId));
00154 
00155     gtk_clist_set_background(GTK_CLIST(provider->pCList),
00156                              1 /* status row */,
00157                              &kernel->colors[bgColorId]);
00158 
00159     sprintf(rowBuffer,"%d",provider->pSampleList.len);
00160     gtk_clist_set_text(GTK_CLIST(provider->pCList),
00161                        4 /* sample symbol row */,
00162                        1 /* information       */,
00163                        rowBuffer);
00164 
00165     /* ----------------------------------------------------------- */
00166 
00167     providerLoad    = provider->pLoad;
00168     provider->pLoad = 0; /* re-init for next cycle */
00169 
00170     if (providerLoad > provider->pMaxLoad) {
00171 
00172       /*
00173        * This may happend because GTK timers are not very precise...
00174        * So a 1 second period timer does not occur exactly every second.
00175        * So percentage may be higher than 100 %.
00176        */
00177       providerLoad = provider->pMaxLoad;
00178 
00179     }
00180 
00181     sprintf(rowBuffer,
00182             "%d Bytes/s, %d %c",
00183             providerLoad,
00184             (guint)(100.0 * (gfloat)providerLoad / (gfloat)provider->pMaxLoad),
00185             '%');
00186 
00187     gtk_clist_set_text(GTK_CLIST(provider->pCList),
00188                        5 /* provider load row */,
00189                        1 /* information       */,
00190                        rowBuffer);
00191 
00192     /* ----------------------------------------------------------- */
00193 
00194     providerItem = g_list_next(providerItem);
00195 
00196   } /* while (providerItem != (GList*)NULL) */
00197 
00198 }
00199 
00200 
00201 /*
00202  --------------------------------------------------------------------
00203                              PUBLIC ROUTINES
00204  --------------------------------------------------------------------
00205 */
00206 
00207 
00208 /*
00209  * These two procedures deal with provider thread management.
00210  * In order to graphically show the status of all providers, a procedure
00211  * is registered in order to pool provider thread status.
00212  * The procedure is registered when the provider page is show in the databook.
00213  * The procedure is unregistered when other pages are shown in the databook.
00214  */
00215 void
00216 gdisp_providerTimer ( Kernel_T  *kernel,
00217                       gboolean   timerIsStarted )
00218 {
00219 
00220 #if defined(PROVIDER_DEBUG)
00221 
00222   fprintf(stdout,
00223           "Provider Timer : %s\n",
00224           timerIsStarted == TRUE ? "STARTED" : "STOPPED");
00225   fflush (stdout);
00226 
00227 #endif
00228 
00229   switch (timerIsStarted) {
00230 
00231   case TRUE :
00232 
00233     /* refresh immediately */
00234     gdisp_poolProviderThreadStatus(kernel);
00235 
00236     (*kernel->registerAction)(kernel,
00237                               gdisp_poolProviderThreadStatus);
00238 
00239     break;
00240 
00241   case FALSE :
00242 
00243     /* stop refreshing thread status */
00244     (*kernel->unRegisterAction)(kernel,
00245                                 gdisp_poolProviderThreadStatus);
00246 
00247     break;
00248 
00249   }
00250 
00251 }
00252 
00253 
00254 /*
00255  * Create GDISP+ provider list.
00256  */
00257 void
00258 gdisp_createProviderList ( Kernel_T  *kernel,
00259                            GtkWidget *parent )
00260 {
00261 
00262   GtkWidget        *frame            =  (GtkWidget*)NULL;
00263   GtkWidget        *vBox             =  (GtkWidget*)NULL;
00264   GtkWidget        *hBox             =  (GtkWidget*)NULL;
00265   GtkWidget        *scrolledWindow   =  (GtkWidget*)NULL;
00266   GtkWidget        *pixmapWidget     =  (GtkWidget*)NULL;
00267   Pixmap_T         *pixmap           =   (Pixmap_T*)NULL;
00268 
00269   GList            *providerItem     =      (GList*)NULL;
00270   Provider_T       *provider         = (Provider_T*)NULL;
00271 
00272   gchar            *rowInfo  [  2];
00273   guint             rowNumber        = 0;
00274   gchar             rowBuffer[128];
00275   guint             bgColorId        = _WHITE_;
00276 
00277 
00278   /* ------------------------ FRAME WITH LABEL ------------------------ */
00279 
00280   /*
00281    * Create a Frame that will contain a scrolled window for providers.
00282    * Align the label at the left of the frame.
00283    * Set the style of the frame.
00284    */
00285   frame = gtk_frame_new(" Available Providers ");
00286   gtk_frame_set_label_align(GTK_FRAME(frame),0.1,0.0);
00287   gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_IN);
00288 
00289   gtk_container_add(GTK_CONTAINER(parent),frame);
00290   gtk_widget_show(frame);
00291 
00292 
00293   /* ----------- SCROLLED WINDOW FOR THE LIST OF PROVIDERS  ----------- */
00294 
00295   /*
00296    * This is the scrolled window to put the List widget inside.
00297    */
00298   scrolledWindow = gtk_scrolled_window_new(NULL /* H Adjustment */,
00299                                            NULL /* V Adjustment */);
00300   gtk_container_border_width(GTK_CONTAINER(scrolledWindow),5);
00301   gtk_container_add(GTK_CONTAINER(frame),scrolledWindow); 
00302   gtk_widget_show(scrolledWindow);
00303 
00304 
00305   /* ----------- VERTICAL BOX FOR HANDLING ALL PROVIDERS  ----------- */
00306 
00307   /*
00308    * We need a vertical packing box for managing all providers.
00309    */
00310   vBox = gtk_vbox_new(FALSE, /* homogeneous */
00311                       5      /* spacing     */ );
00312   gtk_container_border_width(GTK_CONTAINER(vBox),10);
00313   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledWindow),
00314                                         vBox);
00315   gtk_widget_show(vBox);
00316 
00317 
00318   /* ---------------- PER PROVIDER ------------- PER PROVIDER --------- */
00319 
00320   providerItem = g_list_first(kernel->providerList);
00321   while (providerItem != (GList*)NULL) {
00322 
00323     provider = (Provider_T*)providerItem->data;
00324 
00325     provider->pColor = gdisp_getProviderColor(kernel,
00326                                               provider->pIdentity);
00327 
00328 
00329     /* ------------------------ FRAME WITH LABEL ------------------------ */
00330 
00331     /*
00332      * Create a Frame that will contain all provider information.
00333      * Align the label at the left of the frame.
00334      * Set the style of the frame.
00335      */
00336     sprintf(rowBuffer," %d ",provider->pIdentity + 1);
00337     frame = gtk_frame_new((gchar*)NULL /* rowBuffer */);
00338 
00339     gtk_frame_set_label_align(GTK_FRAME(frame),0.1,0.0);
00340     gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_IN);
00341     gtk_box_pack_start(GTK_BOX(vBox),
00342                        frame,
00343                        FALSE, /* expand  */
00344                        FALSE, /* fill    */
00345                        0);    /* padding */
00346     gtk_widget_show(frame);
00347 
00348 
00349     /* ------------------------ HORIZONTAL BOX  ------------------------ */
00350 
00351     /*
00352      * Create a horizontal packing box.
00353      */
00354     hBox = gtk_hbox_new(FALSE, /* homogeneous */
00355                         5      /* spacing     */ );
00356     gtk_container_border_width(GTK_CONTAINER(hBox),10);
00357     gtk_container_add(GTK_CONTAINER(frame),hBox); 
00358     gtk_widget_show(hBox);
00359 
00360 
00361     /* ---------------------- PROVIDER LOGO ---------------------- */
00362 
00363     /*
00364      * Use GDK services to create provider Logo (XPM format).
00365      */
00366     pixmap = gdisp_getPixmapById(kernel,
00367                                  GD_PIX_stubProvider,
00368                                  scrolledWindow);
00369 
00370     pixmapWidget = gtk_pixmap_new(pixmap->pixmap,
00371                                   pixmap->mask);
00372 
00373     gtk_box_pack_start(GTK_BOX(hBox),
00374                        pixmapWidget,
00375                        FALSE, /* expand  */
00376                        FALSE, /* fill    */
00377                        0);    /* padding */
00378     gtk_widget_show(pixmapWidget);
00379 
00380 
00381     /* -------------------------- CLIST --------------------------- */
00382 
00383     /*
00384      * A CList for containing all information.
00385      */
00386     provider->pCList = gtk_clist_new(2 /* columns */);
00387 
00388     gtk_clist_set_shadow_type(GTK_CLIST(provider->pCList),
00389                               GTK_SHADOW_ETCHED_IN);
00390 
00391     gtk_clist_set_button_actions(GTK_CLIST(provider->pCList),
00392                                  0, /* left button */
00393                                  GTK_BUTTON_IGNORED);
00394 
00395     gtk_clist_set_column_auto_resize(GTK_CLIST(provider->pCList),
00396                                      0, /* first column */
00397                                      TRUE);
00398 
00399     /* ------------------ LABELS WITH INFORMATION ------------------- */
00400 
00401     rowInfo[0] = "URL";
00402     rowInfo[1] = provider->pUrl->str;
00403 
00404     rowNumber  = gtk_clist_append(GTK_CLIST(provider->pCList),
00405                                   rowInfo);
00406 
00407     if (gdisp_getProviderNumber(kernel) > 1) {
00408 
00409       pixmap = gdisp_getProviderIdPixmap(kernel,
00410                                          provider->pCList,
00411                                          provider->pIdentity);
00412 
00413       gtk_clist_set_pixtext(GTK_CLIST(provider->pCList),
00414                             rowNumber,
00415                             1, /* second column */
00416                             provider->pUrl->str,
00417                             5, /* spacing */
00418                             pixmap->pixmap,
00419                             pixmap->mask);
00420 
00421     }
00422 
00423     rowInfo[0] = "Status";
00424     rowInfo[1] = gdisp_providerStatusToString(provider->pSamplingThreadStatus,
00425                                               &bgColorId);
00426 
00427     rowNumber  = gtk_clist_append(GTK_CLIST(provider->pCList),
00428                                   rowInfo);
00429 
00430     rowInfo[1] = rowBuffer;
00431 
00432     rowInfo[0] = "Base Frequency";
00433     sprintf(rowInfo[1],"%3.0f",provider->pBaseFrequency);
00434 
00435     rowNumber  = gtk_clist_append(GTK_CLIST(provider->pCList),
00436                                   rowInfo);
00437 
00438     rowInfo[0] = "Total Symbols";
00439     sprintf(rowInfo[1],"%d",provider->pSymbolNumber);
00440 
00441     rowNumber  = gtk_clist_append(GTK_CLIST(provider->pCList),
00442                                   rowInfo);
00443 
00444     rowInfo[0] = "Sampled Symbols";
00445     sprintf(rowInfo[1],"%d",provider->pSampleList.len);
00446 
00447     rowNumber  = gtk_clist_append(GTK_CLIST(provider->pCList),
00448                                   rowInfo);
00449 
00450     /* ----------------------------------------------------------- */
00451 
00452     rowInfo[0] = "Detected Flow";
00453     sprintf(rowInfo[1],"0 Bytes/s, 0 %c",'%');
00454 
00455     rowNumber  = gtk_clist_append(GTK_CLIST(provider->pCList),
00456                                   rowInfo);
00457 
00458     /* FIXME : be careful with 'rowNumber' value */
00459 
00460     /* ----------------------------------------------------------- */
00461 
00462     gtk_box_pack_start(GTK_BOX(hBox),
00463                        provider->pCList,
00464                        TRUE, /* expand  */
00465                        TRUE, /* fill    */
00466                        0);   /* padding */
00467 
00468     gtk_widget_show(provider->pCList);
00469 
00470 
00471     /*
00472      * Next provider.
00473      */
00474     providerItem = g_list_next(providerItem);
00475 
00476   }
00477 
00478 }
00479 
00480 
00481 /*
00482  * Destroy GDISP+ provider list.
00483  */
00484 void
00485 gdisp_destroyProviderList ( Kernel_T *kernel )
00486 {
00487 
00488   /*
00489    * Nothing by now.
00490    */
00491 
00492 }
Framework Home Page.

Beware !! TSP wave is coming...