Alphabetical Class Index  Class Hierarchy   File Members   Compound Members   File List  

HNetMessageRegistrar.h

00001 //
00002 // Copyright (c) 2005 by Tech Soft 3D, LLC.
00003 // The information contained herein is confidential and proprietary to
00004 // Tech Soft 3D, LLC., and considered a trade secret as defined under
00005 // civil and criminal statutes.  Tech Soft 3D shall pursue its civil
00006 // and criminal remedies in the event of unauthorized use or misappropriation
00007 // of its trade secrets.  Use of this information by anyone other than
00008 // authorized employees of Tech Soft 3D, LLC. is granted only under a
00009 // written non-disclosure agreement, expressly prescribing the scope and
00010 // manner of such use.
00011 //
00012 // $Id: 816a47120dc6f794cd644c33a63982eea66d395d $
00013 //
00014 #ifndef _HNetMessageRegistrar_H
00015 #define _HNetMessageRegistrar_H
00016 
00017 #ifndef _HNET_MESSAGE_REGISTRAR
00018 #define _HNET_MESSAGE_REGISTRAR
00019 
00020 #ifdef H_PACK_8
00021 #pragma pack(push)
00022 #pragma pack(8)
00023 #endif
00024 
00025 #include "HBaseView.h"
00026 #include "HOpObjectAnnotate.h"
00027 #include "HOpCreateNurbs3D.h"
00028 #include "HMarkupManager.h"
00029 #include "vhash.h"
00030 #include <stdio.h>
00031 
00032 
00036 class MVOMessageHandler: public HNetMessageHandler {
00037 
00038 public:
00042     MVOMessageHandler(HBaseView * hbaseview){
00043         m_pHBaseView = hbaseview;
00044     };
00050     void ProcessMessage(
00051         const char * message_type,
00052         const char * data,
00053         unsigned int data_length) {;};
00054 
00055 protected:
00057     HBaseView * m_pHBaseView;
00058 };
00059 
00063 class HSetCameraMessageHandler: public MVOMessageHandler {
00064 public:
00068     HSetCameraMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00074     void ProcessMessage(
00075         const char * message_type,
00076         const char * data,
00077         unsigned int data_length) {
00078         m_pHBaseView->SetCameraFromMessage(data, data_length);
00079     };
00080 };
00081 
00085 class HSetRenderModeMessageHandler: public MVOMessageHandler {
00086 public:
00090     HSetRenderModeMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00096     void ProcessMessage(
00097         const char * message_type,
00098         const char * data,
00099         unsigned int data_length) {
00100         m_pHBaseView->SetRenderModeFromMessage(data, data_length);
00101     };
00102 };
00103 
00104 
00108 class HInsertHSFDataMessageHandler: public MVOMessageHandler {
00109 public:
00113     HInsertHSFDataMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00119     void ProcessMessage(
00120         const char * message_type,
00121         const char * data,
00122         unsigned int data_length) {
00123 
00124         m_pHBaseView->InsertHSFDataFromMessage(data, data_length);
00125     };
00126 };
00127 
00131 class HFlushBaseViewMessageHandler: public MVOMessageHandler {
00132 public:
00136     HFlushBaseViewMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00137 
00143     void ProcessMessage(
00144         const char * message_type,
00145         const char * data,
00146         unsigned int data_length) {
00147 
00148         m_pHBaseView->FlushFromMessage(data, data_length);
00149     };
00150 };
00151 
00152 
00156 class HDevNullMessageHandler: public HNetMessageHandler {
00157 public:
00163     void ProcessMessage(
00164         const char * message_type,
00165         const char * data,
00166         unsigned int data_length) {
00167 
00168     };
00169 };
00170 
00175 class HSelectMessageHandler: public MVOMessageHandler {
00176 public:
00180     HSelectMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00189     void ProcessMessage(
00190         const char * message_type,
00191         const char * data,
00192         unsigned int data_length) {
00193 
00194         if (strcmp(message_type,"H_DESELECT_ALL") == 0)
00195             m_pHBaseView->DeSelectAllFromMessage();
00196         else if (strcmp(message_type,"H_DELETE_SELECTION_LIST") == 0)
00197             m_pHBaseView->DeleteSelectionList();
00198         else
00199             m_pHBaseView->SelectFromMessage(data, data_length);
00200     };
00201 };
00202 
00203 
00207 class HDeleteByKeyMessageHandler: public MVOMessageHandler {
00208 public:
00212     HDeleteByKeyMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00213 
00219     void ProcessMessage(
00220         const char * message_type,
00221         const char * data,
00222         unsigned int data_length) {
00223 
00224         m_pHBaseView->DeleteByKeyFromMessage(data, data_length);
00225     };
00226 };
00227 
00228 
00232 class HSetWindowColorMessageHandler: public MVOMessageHandler {
00233 public:
00237     HSetWindowColorMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00243     void ProcessMessage(
00244         const char * message_type,
00245         const char * data,
00246         unsigned int data_length) {
00247 
00248         m_pHBaseView->SetWindowColorFromMessage(data, data_length);
00249     };
00250 };
00251 
00255 class HSetModellingMatrixMessageHandler: public MVOMessageHandler {
00256 public:
00260     HSetModellingMatrixMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00266     void ProcessMessage(
00267         const char * message_type,
00268         const char * data,
00269         unsigned int data_length) {
00270 
00271         m_pHBaseView->SetModellingMatrixFromMessage(data, data_length);
00272     };
00273 };
00274 
00279 class HMarkupMessageHandler: public MVOMessageHandler {
00280 public:
00284     HMarkupMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00293     void ProcessMessage(
00294         const char * message_type,
00295         const char * data,
00296         unsigned int data_length) {
00297 
00298         if (strcmp(message_type,"H_INSERT_MARKUP_LAYER_HSF_DATA") == 0)
00299             m_pHBaseView->GetMarkupManager()->InsertMarkupSegmentFromMessage(data, data_length);
00300         else if (strcmp(message_type,"H_SET_MARKUP_LAYER") == 0)
00301             m_pHBaseView->GetMarkupManager()->SetMarkupLayerFromMessage(data, data_length);
00302         else if (strcmp(message_type,"H_DISABLE_CURRENT_MARKUP_LAYER") == 0)
00303             m_pHBaseView->GetMarkupManager()->DisableCurrentMarkupLayerFromMessage(data, data_length);
00304     };
00305 };
00306 
00310 class HAnnotateObjectMessageHandler: public MVOMessageHandler {
00311 public:
00315     HAnnotateObjectMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00316     
00322     void ProcessMessage(
00323         const char * message_type,
00324         const char * data,
00325         unsigned int data_length) {
00326 
00327         HOpObjectAnnotate::AnnotateObjectFromMessage(m_pHBaseView, data, data_length);
00328     };
00329 };
00330 
00335 class HNurbsMessageHandler: public MVOMessageHandler {
00336 public:
00340     HNurbsMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00349     void ProcessMessage(
00350         const char * message_type,
00351         const char * data,
00352         unsigned int data_length) {
00353 
00354         if (strcmp(message_type,"H_INSERT_NURBS") == 0)
00355             HOpCreateNurbs3D::InsertNurbsFromMessage(data, data_length, m_pHBaseView);
00356         else if(strcmp(message_type,"H_FINISH_NURBS_EDITING") == 0)
00357             HOpCreateNurbs3D::FinishNurbsEditingFromMessage(data, data_length,m_pHBaseView);
00358         else if(strcmp(message_type,"H_MODIFY_CONTROL_POINT") == 0)
00359             HOpCreateNurbs3D::ModifyControlPointFromMessage(data, data_length, m_pHBaseView);
00360     };
00361 };
00362 
00366 class HSetHandednessMessageHandler: public MVOMessageHandler {
00367 public:
00371     HSetHandednessMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00377     void ProcessMessage(
00378         const char * message_type,
00379         const char * data,
00380         unsigned int data_length) {
00381         m_pHBaseView->SetHandednessFromMessage(data, data_length);
00382     };
00383 };
00384 
00388 class HSetFontSizeMessageHandler: public MVOMessageHandler {
00389 public:
00393     HSetFontSizeMessageHandler(HBaseView * hbaseview):MVOMessageHandler(hbaseview){;};
00399     void ProcessMessage(
00400         const char * message_type,
00401         const char * data,
00402         unsigned int data_length) {
00403         m_pHBaseView->SetFontSizeFromMessage(data, data_length);
00404     };
00405 };
00406 
00407 
00409 
00413 class HNetMessageRegistrar {
00414 
00415 public:
00416 
00423     HNetMessageRegistrar(
00424         HBaseView * new_hbaseview, 
00425         HNetClient * new_hnetclient=0) {
00426         
00427         hbaseview=new_hbaseview; 
00428         hnetclient=new_hnetclient;
00429 
00430         if(!hnetclient)
00431             message_handler_hash = new_vhash(1, malloc, free);
00432         else
00433             message_handler_hash = 0;
00434 
00435         default_message_handler=0;
00436 
00437     };
00438 
00443     virtual ~HNetMessageRegistrar() {
00444 
00445         UnSetHandlers();
00446 
00447         if(message_handler_hash) {
00448             delete_vhash(message_handler_hash);
00449             message_handler_hash=0;
00450         }
00451     }
00452 
00462     virtual void SetHandlers(){
00463 
00464         SetMessageHandler( new HSetCameraMessageHandler(hbaseview), "H_SET_CAMERA");
00465         SetMessageHandler( new HSetRenderModeMessageHandler(hbaseview), "H_SET_RENDERMODE");
00466         SetMessageHandler( new HInsertHSFDataMessageHandler(hbaseview), "H_INSERT_HSF_DATA");
00467         SetMessageHandler( new HFlushBaseViewMessageHandler(hbaseview), "H_FLUSH_BASE_VIEW");
00468         SetMessageHandler( new HDevNullMessageHandler(), "H_DEV_NULL_DATA");
00469         SetMessageHandler( new HSelectMessageHandler(hbaseview), "H_SELECT_ENTITY");
00470         SetMessageHandler( new HSelectMessageHandler(hbaseview), "H_DESELECT_ALL");
00471         SetMessageHandler( new HDeleteByKeyMessageHandler(hbaseview), "H_DELETE_BY_KEY");
00472         SetMessageHandler( new HSelectMessageHandler(hbaseview), "H_DELETE_SELECTION_LIST");
00473         SetMessageHandler( new HSetModellingMatrixMessageHandler(hbaseview), "H_SET_MODELLING_MATRIX");
00474         SetMessageHandler( new HAnnotateObjectMessageHandler(hbaseview), "H_ANNOTATE_OBJECT");
00475         SetMessageHandler( new HNurbsMessageHandler(hbaseview), "H_INSERT_NURBS");
00476         SetMessageHandler( new HNurbsMessageHandler(hbaseview), "H_MODIFY_CONTROL_POINT");
00477         SetMessageHandler( new HNurbsMessageHandler(hbaseview), "H_FINISH_NURBS_EDITING");
00478         SetMessageHandler( new HSetWindowColorMessageHandler(hbaseview), "H_SET_WINDOW_COLOR");
00479         SetMessageHandler( new HMarkupMessageHandler(hbaseview), "H_DISABLE_MARKUP_LAYER");
00480         SetMessageHandler( new HMarkupMessageHandler(hbaseview), "H_SET_MARKUP_LAYER");
00481         SetMessageHandler( new HMarkupMessageHandler(hbaseview), "H_INSERT_MARKUP_LAYER_HSF_DATA");
00482         SetMessageHandler( new HSetHandednessMessageHandler(hbaseview), "H_SET_HANDEDNESS");
00483         SetMessageHandler( new HSetFontSizeMessageHandler(hbaseview), "H_SET_FONT_SIZE");
00484 
00485     };
00486 
00492     virtual void UnSetHandlers(){
00493 
00494         if(hnetclient){ 
00495 
00496             hnetclient->EnumerateMessageHandlers(
00497                 net_unset_message_handler_helper, hnetclient);
00498 
00499         }else
00500         if(message_handler_hash){
00501             vhash_string_key_map_function(
00502                     message_handler_hash,
00503                     non_net_unset_message_handler_helper,
00504                     (void*)this);
00505         }
00506 
00507     };
00508 
00533     virtual HNetMessageHandler * SetMessageHandler(
00534             HNetMessageHandler * handler,
00535             const char * message_type)
00536     {
00537         HNetMessageHandler * old_handler=0;
00538         if(hnetclient)
00539             old_handler = hnetclient->SetMessageHandler(handler,message_type);
00540         else
00541         if(message_type){
00542             old_handler = (HNetMessageHandler *)vhash_remove_string_key(message_handler_hash, message_type);
00543             if(handler)
00544                 vhash_insert_string_key(message_handler_hash, message_type, (void*) handler);
00545         }else{
00546             if(default_message_handler) old_handler = default_message_handler;
00547             default_message_handler = handler;
00548         }
00549         return old_handler;
00550     }
00551 
00561     bool ReadSnapFile(const char * file_name) {
00562 
00563         FILE * file = fopen(file_name,"rb");
00564 
00565         if(file==NULL) return false;
00566         if(hnetclient) return false;
00567 
00568         unsigned long line_number = 0;
00569         unsigned long line_buffer_size = 1024;
00570         char * line_buffer;
00571         unsigned long n;
00572         unsigned long expected_n;
00573         int a_char;
00574         int read_again = 1;
00575 
00576         line_buffer = (char*) malloc(line_buffer_size);
00577         fseek(file,0,SEEK_SET);
00578 
00579 READ_A_LINE:
00580         n=0;
00581         expected_n=0;
00582         line_number++;
00583 
00584         while(1) {
00585             /*resize buffer as needed*/
00586             if(n == line_buffer_size) {
00587                 char * new_line_buffer;
00588                 new_line_buffer = (char*) malloc(line_buffer_size*2);
00589                 memcpy(new_line_buffer, line_buffer, line_buffer_size);
00590                 free(line_buffer);
00591                 line_buffer = new_line_buffer;
00592                 line_buffer_size = line_buffer_size*2;
00593             }
00594             a_char = fgetc(file);
00595             if(a_char == EOF) {
00596                 read_again=0;
00597                 break;
00598             }
00599             if(expected_n) {
00600                 line_buffer[n] = (char) a_char;
00601                 n++;
00602                 if(n==expected_n) {
00603                     /*have a whole line*/
00604                     ProcessMessage(line_buffer, n);
00605                     break;
00606                 }
00607             }else{
00608                 if(a_char == 0x0D || a_char == 0x0A) {
00609                     if(n == 0) continue;
00610                     /*this is a error in the file*/
00611                     read_again=0;
00612                     break;
00613                 }
00614                 if (a_char == ' ') {
00615                     line_buffer[n] = '\0';
00616                     sscanf(line_buffer, "%ld", &expected_n);
00617                     n=0;
00618                 }else{
00619                     line_buffer[n] = (char) a_char;
00620                     n++;
00621                 }
00622             }
00623         }
00624         if(read_again)
00625             goto READ_A_LINE;
00626         free(line_buffer);
00627         return true;
00628     };
00629 
00630 
00631 protected:
00632 
00640     virtual void ProcessMessage(
00641             const char * message,
00642             unsigned long message_length) {
00643 
00644             if(hnetclient) return;
00645 
00646             char * message_type = (char*) malloc(message_length);
00647             unsigned long n = 0;
00648 
00649             while(n < message_length && message[n] != ' ') {
00650                 message_type[n] = message[n];
00651                 n++;
00652             }
00653             message_type[n] = '\0';
00654             n++;
00655             HNetMessageHandler * message_handler =
00656                 (HNetMessageHandler *) vhash_lookup_string_key(message_handler_hash, message_type);
00657 
00658             if(!message_handler)
00659                 message_handler = default_message_handler;
00660             if(message_handler) 
00661                 message_handler->ProcessMessage(message_type, &message[n], message_length-n);
00662             free(message_type);
00663     }
00664 
00666     HBaseView * hbaseview; 
00668     HNetClient * hnetclient;
00669 
00670 private:
00671     struct vhash_s * message_handler_hash;
00672     HNetMessageHandler * default_message_handler;
00673 
00674     static void net_unset_message_handler_helper(
00675         void * handler,
00676         const char * message,
00677         void * user_data){
00678 
00679         ((HNetClient*)user_data)->SetMessageHandler(0,message);
00680         delete (HNetMessageHandler*)handler;
00681     };
00682 
00683     static void non_net_unset_message_handler_helper(
00684             void * handler,
00685             const char * message,
00686             void * user_data){
00687 
00688         HNetMessageRegistrar * self = (HNetMessageRegistrar *) user_data;
00689         self->SetMessageHandler(0,message);
00690         delete (HNetMessageHandler*)handler;
00691     };
00692 
00693 };
00694 
00695 
00696 #ifdef H_PACK_8
00697 #pragma pack(pop)
00698 #endif
00699 
00700 #endif
00701 #endif
00702 
00703 
00704