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$ 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