Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4UIGainServer.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// 12/06/2002 G4UIGainServer H. MInamimoto and H. Yoshida created
28// $Id$
29//
30#ifndef WIN32
31
32#include "G4UIGainServer.hh"
33#include <netdb.h>
34
35#include <sstream>
36#include "G4StateManager.hh"
37#include "G4UIcommandTree.hh"
38#include "G4UIcommand.hh"
39#include "G4UIcommandStatus.hh"
40
41
42//////////////////////////////////////////////
44//////////////////////////////////////////////
45{
46 TVersion ="T1.0a"; JVersion="J1.0a";
47 prefix = "/";
48
49 port = DEFAULT_PORT;
50 while(SetUPServer() == false){
51 G4cout<<"can't get the port no. "<<port<<" Now, try to get the next port "<<port+1<<G4endl;
52 port++;
53 }
54
55
57 UI-> SetSession(this);
58 UI-> SetCoutDestination(this);
59
61 promptCharacter = statM->GetStateString(statM->GetCurrentState());
62 uiMode = terminal_mode;
63
64 iExit= FALSE;
65 iCont= FALSE;
66
67 G4UIcommandTree* tree = UI->GetTree();
68 GetNewTreeStructure(tree,0);
69 GetNewTreeValues(tree,0);
70 previousTreeCommands = newTreeCommands;
71 previousTreeParams = newTreeParams;
72 previousTreePCP = newTreePCP;
73
74}
75
76/////////////////////////////
78/////////////////////////////
79{
80
82 UI-> SetSession(NULL);
83 UI-> SetCoutDestination(NULL);
84 }
85
87 UI->SetSession(NULL);
88 UI->SetCoutDestination(NULL);
89 }
90}
91
92
93/////////////////////////////////////////
95/////////////////////////////////////////
96{
97 G4String newCommand;
98
100 promptCharacter = statM->GetStateString(statM->GetCurrentState());
101
102 iExit= TRUE;
103
104 WaitingConnection();
105 while(iExit){
106 newCommand= GetCommand();
107 ExecuteCommand(newCommand);
108 }
109 return NULL;
110}
111
112//////////////////////////////////////////////////
114//////////////////////////////////////////////////
115{
116 promptCharacter = msg;
117 G4cout<<"@@PROMPT \""<<promptCharacter<<"\""<<G4endl;
118
119 iCont= TRUE;
120
121 G4String newCommand= GetCommand();
122 while(iCont){
123 ExecuteCommand(newCommand);
124 newCommand= GetCommand();
125 strcpy(buf,"nowIdle");
126 write(socketD[1],buf,strlen(buf));
127 }
128}
129
130////////////////////////////////////////////////////
131void G4UIGainServer::ExecuteCommand(const G4String& aCommand)
132////////////////////////////////////////////////////
133{
134 if(aCommand.length()<2) return;
135
136 G4UIcommandTree* tree = UI->GetTree();
137 if(aCommand.length()<2) return;
138 G4int returnVal = UI->ApplyCommand(aCommand);
139 G4int paramIndex = returnVal % 100;
140 // 0 - 98 : paramIndex-th parameter is invalid
141 // 99 : convination of parameters is invalid
142 G4int commandStatus = returnVal - paramIndex;
143
144 UpdateState();
145
146 if(uiMode != terminal_mode){
147 switch(commandStatus) {
149 GetNewTreeStructure(tree,0);
150 GetNewTreeValues(tree,0);
151 if(CommandUpdated()){
152 NotifyCommandUpdate();
153 } else{
154 UpdateParamVal();
155 }
156 previousTreeCommands = newTreeCommands;
157 previousTreeParams = newTreeParams;
158 previousTreePCP = newTreePCP;
159 break;
160 case fCommandNotFound:
161 G4cerr << "@@ErrResult \" <" << UI->SolveAlias(aCommand) << "> not found.\"" << G4endl;
162 break;
164 G4cerr << "@@ErrResult \"illegal application state -- command refused.\"" << G4endl;
165 break;
167 G4cout << "@@ErrResult \"Parameter Out of Range.\"" << G4endl;
168 break;
170 G4cout << "@@ErrResult \"Parameter is wrong type and/or is not omittable.\""<<G4endl;
171 break;
173 G4cerr << "@@ErrResult \"Parameter is out of candidate.\"" << G4endl;
174 break;
175 case fAliasNotFound:
176 default:
177 G4cerr << "command refused (" << commandStatus << ")" << G4endl;
178 }
179 }
180}
181
182///////////////////////////////////
184///////////////////////////////////
185{
186 G4String newCommand;
187 G4String nullString;
188
189 while( 1 )
190 {
191 G4UIcommandTree* tree = UI->GetTree();
192 if ( uiMode != terminal_mode ){
193 G4cout << "@@PROMPT \"" << promptCharacter << "\"" << G4endl;
194 }
195 if ( uiMode != java_mode ){
196 G4cout << promptCharacter << "> " << G4endl;
197 }else{
198 G4cout << "@@Ready" << G4endl;
199 }
200
201
202 /////////////////////////////
203 /////////////////////////////
204 read(socketD[1],buf,1024);
205 newCommand=buf;
206 //DEBUG cout<<"->"<<newCommand<<"<-"<<newCommand.length()<<G4endl;
207 //newCommand.readLine( G4cin, FALSE );
208 /////////////////////////////
209 /////////////////////////////
210
211
212
213 if (!G4cin.good()) { G4cin.clear(); newCommand = nullString; iExit=false;break;}
214
215 newCommand = newCommand.strip(G4String::leading);
216 if( newCommand.length() < 1) { break; }
217
218 while( newCommand(newCommand.length()-1) == '_' )
219 {
220 G4String newLine;
221 newCommand.remove(newCommand.length()-1);
222 newLine.readLine( G4cin );
223 if (!G4cin.good()) { G4cin.clear(); newCommand = nullString; iExit=false;break;}
224 newCommand.append(newLine);
225 }
226
227 G4String nC = newCommand.strip(G4String::leading);
228 if( nC.length() < 1) { break; }
229
230 // -------------------- nC.toUpper();
231 if( nC == "@@GainmodeJAVA" ) {
232 uiMode = java_mode;
233 G4cout << G4endl << "@@Version " << JVersion << G4endl;
234 SendCommandProperties(tree);
235 NotifyStateChange();
236 }
237 else if( nC == "@@GainmodeTcl" ) {
238 uiMode = tcl_mode;
239 G4cout << G4endl << "@@Version " << TVersion << G4endl;
240 SendCommandProperties(tree);
241 NotifyStateChange();
242 }
243 else if( nC(0) == '#' )
244 { G4cout << nC << G4endl; }
245
246 else if( nC == "ls" || nC(0,3) == "ls " )
247 { ListDirectory( nC ); }
248 else if( nC == "pwd" )
249 { G4cout << "Current Working Directory : " << prefix << G4endl; }
250 else if( nC(0,2) == "cd" || nC(0,3) == "cd " )
251 { ChangeDirectory( nC ); }
252 else if( nC == "help" || nC(0,5) == "help ")
253 { TerminalHelp( nC ); }
254 else if( nC(0) == '?' )
255 { ShowCurrent( nC ); }
256 else if( nC(0,4) == "hist" || nC == "history")
257 {
258 G4int nh = UI->GetNumberOfHistory();
259 for(int i=0;i<nh;i++)
260 { G4cout << i << ": " << UI->GetPreviousCommand(i) << G4endl; }
261 }
262 else if( nC(0) == '!' )
263 {
264 G4String ss = nC(1,nC.length()-1);
265 G4int vl;
266 const char* tt = ss;
267 std::istringstream is((char*)tt);
268 is >> vl;
269 G4int nh = UI->GetNumberOfHistory();
270 if(vl>=0 && vl<nh)
271 {
272 newCommand = UI->GetPreviousCommand(vl);
273 G4cout << newCommand << G4endl;
274 break;
275 }
276 else
277 { G4cerr << "history " << vl << " is not found." << G4endl; }
278 }
279 else if( nC(0,4) == "exit" )
280 {
281 if( iCont )
282 {
283 if ( uiMode == terminal_mode){
284 G4cerr << "You are now processing RUN." << G4endl;
285 G4cerr << "Please abrot it using \"/run/abort\" command first" << G4endl;
286 G4cerr << " and use \"continue\" command until the application" << G4endl;
287 G4cerr << " becomes to Idle." << G4endl;
288 }else{
289 G4cout << "@@ErrResult \"You are now processing RUN.\"" << G4endl;
290 }
291 }
292 else
293 {
294 close(socketD[1]);
295 close(socketD[2]);
296 iExit = false;
297 newCommand = nullString;
298 break;
299 }
300 }
301 else if( nC == "cont" || nC == "continue" )
302 {
303 iCont = false;
304 newCommand = nullString;
305 break;
306 }
307 else
308 { break; }
309 }
310 return GetFullPath(newCommand);
311}
312
313//////////////////////////////////////////////////////
315//////////////////////////////////////////////////////
316{
317 if(socketD[1]>0){
318 write(socketD[1],coutString,coutString.length());
319 }
320 return 0;
321
322 //std::cout << coutString << std::flush;
323 //return 0;
324}
325
326//////////////////////////////////////////////////////
328//////////////////////////////////////////////////////
329{
330 if(socketD[2]>0){
331 write(socketD[2],cerrString,cerrString.length());
332 }
333 return 0;
334
335 //std::cerr << cerrString << std::flush;
336 //return 0;
337}
338
339/////////////////////////////////////////////////
340G4bool G4UIGainServer::GetHelpChoice(G4int& aInt)
341/////////////////////////////////////////////////
342{
343 G4cin >> aInt;
344 if(!G4cin.good()){
345 G4cin.clear();
346 G4cin.ignore(30,'\n');
347 return FALSE;
348 }
349 return TRUE;
350}
351
352/////////////////////////////
353void G4UIGainServer::ExitHelp() const
354/////////////////////////////
355{
356 char temp[100];
357 G4cin.getline(temp, 100);
358}
359
360/////////////////////////////
361bool G4UIGainServer::SetUPServer(){
362/////////////////////////////
363
364 socketD[0] = socket(AF_INET,SOCK_STREAM,0);
365
366 if(socketD[0]<0){
367 perror("server:socket");
368 return (false);
369 //exit(1);
370 }
371
372 memset( (char *)&saddr,'\0',sizeof(saddr)) ;
373
374 saddr.sin_family = AF_INET;
375 saddr.sin_addr.s_addr = INADDR_ANY;
376 saddr.sin_port = htons(port);
377 unlink(SOCK_NAME);
378
379 if(bind(socketD[0] , (struct sockaddr *)&saddr , sizeof(saddr))<0){
380 perror("bind");
381 return (false);
382 //exit(1);
383 }
384 else{ G4cout<<"G4GainServer waiting at "<<port<<G4endl; }
385
386 if(listen(socketD[0],1)<0){
387 perror("listen");
388 return (false);
389 //exit(1);
390 }
391
392 return (true);
393}
394
395////////////////////////////////////////
396void G4UIGainServer::WaitingConnection(){
397////////////////////////////////////////
398 len = sizeof(caddr);
399
400 for(int i=1;i<=2;i++){
401#if defined __APPLE__ && (__GNUC__<4)
402 if((socketD[i] = accept(socketD[0], (struct sockaddr *)&caddr,(int *)&len))<0){
403#else
404 if((socketD[i] = accept(socketD[0], (struct sockaddr *)&caddr,(socklen_t *)&len))<0){
405#endif
406 G4cerr<<"accept:"<<i<<G4endl;
407 //exit(1);
408 G4Exception("G4UIGainServer::WaitingConnection()",
409 "UI0004",
411 "Invalid Socket. Cannot establish connection");
412 }
413 }
414 close(socketD[0]);
415}
416
417///////////////////////////////////////////////////
418G4String G4UIGainServer::GetFullPath(G4String aNewCommand){
419///////////////////////////////////////////////////
420 G4String newCommand = aNewCommand.strip(G4String::both);
421 G4String tmpString;
422 if( newCommand(0) == '/' )
423 { tmpString = newCommand; }
424 else if( newCommand(0,3) == "../" )
425 {
426 G4String tmpPrefix = prefix;
427 /*G4int*/ unsigned i_direc = 0;
428 while( i_direc < newCommand.length() )
429 {
430 if( newCommand(i_direc,3) == "../" )
431 {
432 i_direc += 3;
433 prefix = ModifyPrefix( G4String("../") );
434 }
435 else
436 { break; }
437 }
438 tmpString = prefix;
439 tmpString.append( newCommand( i_direc, newCommand.length()-i_direc ) );
440 prefix = tmpPrefix;
441 }
442 else
443 {
444 tmpString = prefix;
445 tmpString.append( newCommand );
446 }
447 return tmpString;
448}
449
450////////////////////////////////
452////////////////////////////////
453 G4cout<<"***** Terminal session end *****"<<G4endl;
454}
455
456
457//////////////////////////////////////////////
458void G4UIGainServer::ShowCurrent(G4String newCommand){
459//////////////////////////////////////////////
460 G4String theCommand = GetFullPath(newCommand(1,newCommand.length()-1));
461 G4String curV = UI->GetCurrentValues(theCommand);
462 if( ! (curV.isNull()||curV(0)=='\0' ) ) {
463 if (uiMode == terminal_mode){
464 G4cout << "Current value(s) of the parameter(s) : " << curV << G4endl;
465 }else{
466 G4cout << "@@CurrentValue " << curV << G4endl;
467 }
468 } else if (uiMode == terminal_mode){
469 G4cout << "Current value is not available." << G4endl;
470 } else {
471 G4cout << "@@ErrResult \"Current value is not available.\"" << G4endl;
472 }
473}
474
475//////////////////////////////////////////////////
476void G4UIGainServer::ChangeDirectory(G4String newCommand){
477//////////////////////////////////////////////////
478 G4String savedPrefix = prefix;
479 if( newCommand.length() <= 3 )
480 { prefix = "/"; }
481 else
482 {
483 G4String aNewPrefix = newCommand(3,newCommand.length()-3);
484 G4String newPrefix = aNewPrefix.strip(G4String::both);
485 if( newPrefix(0) == '/' )
486 { prefix = newPrefix; }
487 else if( newPrefix(0) != '.' )
488 {
489 prefix += newPrefix;
490 }
491 else
492 { prefix = ModifyPrefix( newPrefix ); }
493 }
494 if( prefix( prefix.length() - 1 ) != '/' )
495 { prefix += "/"; }
496 if( FindDirPath( prefix ) == NULL )
497 {
498 G4cout << "Directory <" << prefix << "> is not found." << G4endl;
499 prefix = savedPrefix;
500 }
501}
502////////////////////////////////////////////////
503void G4UIGainServer::ListDirectory(G4String newCommand){
504////////////////////////////////////////////////
505 G4String targetDir('\0');
506 if( newCommand.length() <= 3 )
507 { targetDir = prefix; }
508 else
509 {
510 G4String newPrefix = newCommand(3,newCommand.length()-3);
511 newPrefix.strip(G4String::both);
512 if( newPrefix(0) == '/' )
513 { targetDir = newPrefix; }
514 else if( newPrefix(0) != '.' )
515 {
516 targetDir = prefix;
517 targetDir += newPrefix;
518 }
519 else
520 { targetDir = ModifyPrefix( newPrefix ); }
521 }
522 if( targetDir( targetDir.length() - 1 ) != '/' )
523 { targetDir += "/"; }
524 G4UIcommandTree * commandTree = FindDirPath( targetDir );
525 if( commandTree == NULL )
526 { G4cout << "Directory <" << targetDir << "> is not found." << G4endl; }
527 else
528 { commandTree->ListCurrent(); }
529}
530
531///////////////////////////////////////////////
532void G4UIGainServer::TerminalHelp(G4String newCommand){
533///////////////////////////////////////////////
534 G4UIcommandTree* treeTop = UI->GetTree();
535 str_size i = newCommand.index(" ");
536
537 if(i!=std::string::npos){
538 G4String newValue = newCommand(i+1,newCommand.length()-(i+1));
539 newValue.strip(G4String::both);
540 if(newValue(0)!='/'){
541 newValue.prepend(prefix);
542 }
543 G4UIcommand* theCommand = treeTop->FindPath(newValue);
544 if(theCommand !=NULL){
545 theCommand->List();
546 return;
547 }
548 else{
549 G4cout<<"Command<" << newValue << "is not found."<<G4endl;
550 return;
551 }
552 }
553
554 G4UIcommandTree* floor[10];
555 floor[0] = treeTop;
556 int iFloor = 0;
557 unsigned prefixIndex = 1;
558 while(prefixIndex<prefix.length()-1){
559 int ii = prefix.index("/",prefixIndex);
560 floor[iFloor+1]=
561 floor[iFloor]->GetTree(G4String(prefix(0,ii+1)));
562 prefixIndex = ii+1;
563 iFloor++;
564 }
565 floor[iFloor]->ListCurrentWithNum();
566 while(1){
567 int j;
568 G4cout<<G4endl <<"Type the number (0:end, -n:n level back) :"<<std::flush;
569 G4cin >> j;
570 if(!G4cin.good()){
571 G4cin.clear();
572 G4cin.ignore(30,'\n');
573 G4cout<<G4endl <<"Not a number,once more"<<G4endl; continue;
574 }
575 else if(j<0){
576 iFloor += j;
577 if(iFloor <0) iFloor =0;
578 floor[iFloor]->ListCurrentWithNum(); continue;
579 }
580 else if(j==0){break;}
581 else if(j>0){
582 int n_tree = floor[iFloor]->GetTreeEntry();
583 if(j>n_tree){
584 if(j<=n_tree+floor[iFloor]->GetCommandEntry()){
585 floor[iFloor]->GetCommand(j-n_tree)->List();
586 }
587 }
588 else{
589 floor[iFloor+1] = floor[iFloor]->GetTree(j);
590 iFloor++;
591 floor[iFloor]->ListCurrentWithNum();
592 }
593 }
594 }
595 G4cout<<"Exit from Help."<<G4endl <<G4endl;
596 G4cout<<G4endl;
597 char temp[100];
598 G4cin.getline(temp,100);
599}
600
601
602///////////////////////////////////////////////////
603G4String G4UIGainServer::ModifyPrefix(G4String newCommand){
604///////////////////////////////////////////////////
605 G4String newPrefix = prefix;
606 while(1){
607 if(newCommand(0,2) ==".."){
608 if(newPrefix !="/"){
609 G4String tmpString = newPrefix(0,newPrefix.length()-1);
610 newPrefix = newPrefix(0,tmpString.last('/')+1);
611 }
612 }
613 else{
614 newPrefix += newCommand;
615 break;
616 }
617 if(newCommand == ".." || newCommand == "../"){
618 break;
619 }
620 newCommand=newCommand(3,newCommand.length()-3);
621 }
622 return newPrefix;
623}
624
625//////////////////////////////////////////////////////////
626G4UIcommandTree* G4UIGainServer::FindDirPath(G4String newCommand){
627//////////////////////////////////////////////////////////
628 G4UIcommandTree * comTree = UI->GetTree();
629 /*int*/ unsigned idx = 1;
630 while( idx < newCommand.length()-1 )
631 {
632 int i = newCommand.index("/",idx);
633 comTree = comTree->GetTree(G4String(newCommand(0,i+1)));
634 if( comTree == NULL )
635 { return NULL; }
636 idx = i+1;
637 }
638 return comTree;
639}
640
641//// ----- for JAVA Gain
642
643//////////////////////////////////////////////////////////
644void G4UIGainServer::SendCommandProperties(G4UIcommandTree* tree){
645//////////////////////////////////////////////////////////
646 if( tree == NULL ) {
647 G4cerr << "GetTree() returnes null." << G4endl;
648 return;
649 }
650 if (uiMode == java_mode){
651 G4cout << "@@JTreeBegin" << G4endl;
652 CodeGenJavaTree(tree, 0);
653 G4cout << "@@JTreeEnd" << G4endl;
654 CodeGenJavaParams(tree, 0);
655 }else{}
656}
657
658////////////////////////////////////////////////////////////
659void G4UIGainServer::SendParameterProperties(G4UIcommandTree* tree){
660////////////////////////////////////////////////////////////
661 if( tree == NULL ) {
662 G4cerr << "GetTree() returnes null." << G4endl;
663 return;
664 }
665 if (uiMode == java_mode){
666 CodeGenJavaParams(tree, 0);
667 }else{ }
668}
669
670//////////////////////////////////////////////////////////////
671void G4UIGainServer::CodeGenJavaTree(G4UIcommandTree* tree,int level){
672//////////////////////////////////////////////////////////////
673 int treeEntry, commandEntry;
674 treeEntry = tree->GetTreeEntry();
675 commandEntry = tree->GetCommandEntry();
676
677 if(level!=0) {
678 for(int i=0; i<commandEntry; i++){
679 G4cout << tree->GetCommand(i+1)->GetCommandPath() << G4endl;
680 }
681 }
682 if(treeEntry == 0) return; //end recursion
683
684 for(int j=0; j<treeEntry; j++){
685 CodeGenJavaTree(tree->GetTree(j+1), level+1);
686 }
687}
688
689////////////////////////////////////////////////////////////////
690void G4UIGainServer::CodeGenJavaParams(G4UIcommandTree* tree,int level){
691////////////////////////////////////////////////////////////////
692 int treeEntry,commandEntry,i;
693 G4UIcommandTree* treeLink;
694
695 treeEntry = tree->GetTreeEntry();
696 commandEntry = tree->GetCommandEntry();
697
698 for(i=0;i<commandEntry; i++){
699 SendAParamProperty(tree->GetCommand(i+1));
700 }
701 if(treeEntry ==0) return;
702
703 for(i=0;i<treeEntry; i++){
704 treeLink = tree->GetTree(i+1);
705 G4cout<<"@@JDirGuieBegin"<<G4endl;
706 G4cout<<treeLink->GetPathName()<<G4endl <<treeLink->GetTitle()<<G4endl;
707 G4cout<<"@@JDirGuideEnd"<<G4endl;
708 CodeGenJavaParams(treeLink,level+1);
709 }
710}
711
712///////////////////////////////////////////////////
713void G4UIGainServer::SendAParamProperty(G4UIcommand* Comp){
714///////////////////////////////////////////////////
715 int guidanceEntry, parameterEntry;
716 G4String title, title2;
717 G4UIparameter * prp;
718 char c[2];
719 guidanceEntry = Comp->GetGuidanceEntries();
720 parameterEntry = Comp->GetParameterEntries();
721 G4cout << "@@JParamBegin" << G4endl;
722 G4cout << Comp->GetCommandPath() << G4endl;
723 G4cout << guidanceEntry << G4endl;
724 for (int j=0; j<guidanceEntry; j++){
725 title = Comp->GetGuidanceLine(j);
726 title2 = "";
727 if (title != ""){
728 for(int i=0; i< (int)title.length(); i++){
729 c[0]=title(i);
730 c[1]= '\0';
731 if ( c[0] == '\n' || c[0] == '\r') {
732 c[0]= ' ';
733 }
734 title2.append(c);
735 }
736 }
737 G4cout << title2 << G4endl;
738 }
739 G4cout << Comp->GetRange() << G4endl;
740 G4cout << parameterEntry << G4endl;
741 for( int par=0; par<parameterEntry; par++) {
742 prp = (G4UIparameter *)Comp->GetParameter(par);
743 G4cout << prp->GetParameterName() << G4endl;
745 G4cout << prp->GetParameterType() << G4endl;
746 G4cout << prp->IsOmittable() << G4endl;
747 G4cout << prp->GetDefaultValue() << G4endl;
748 G4cout << prp->GetParameterRange() << G4endl;
750 }
751 G4cout << "@@JParamEnd" << G4endl;
752}
753
754//////////////////////////////////////////////////////////////
755void G4UIGainServer::SendDisableList(G4UIcommandTree* tree,int level){
756//////////////////////////////////////////////////////////////
757 int treeEntry, commandEntry;
758 G4UIcommand * Comp;
759 treeEntry = tree->GetTreeEntry();
760 commandEntry = tree->GetCommandEntry();
761
762 for(int com=0; com<commandEntry; com++) {
763 Comp = tree->GetCommand(com+1);
764 if( Comp->IsAvailable()==false ) {
765 G4cout << Comp->GetCommandPath()<<G4endl;
766 }
767 }
768 if( treeEntry == 0 ) return; // end recursion
769
770 for( int i=0; i<treeEntry; i++) {
771 SendDisableList(tree->GetTree(i+1), level+1);
772 // be sure the function name is the same
773 }
774}
775
776
777
778//####### update check routines ####################################
779
780///////////////////////////////
781void G4UIGainServer::UpdateState(void)
782///////////////////////////////
783{
784 static G4ApplicationState previousState= G4State_PreInit;
785 G4ApplicationState newState;
787 newState = statM->GetCurrentState();
788 if( newState != previousState )
789 {
790 NotifyStateChange();
791 previousState = newState;
792 }
793}
794
795/////////////////////////////////////
796void G4UIGainServer::NotifyStateChange(void)
797/////////////////////////////////////
798{
799 G4String stateString;
801 G4UIcommandTree * tree = UI->GetTree();
802 stateString = statM->GetStateString(statM->GetCurrentState());
803 if ( uiMode != terminal_mode ){
804 G4cout << "@@State \"" << stateString << "\"" << G4endl;
805 G4cout << "@@DisableListBegin"<<G4endl;
806 SendDisableList(tree, 0);
807 G4cout << "@@DisableListEnd" <<G4endl;
808 }
809}
810
811///////////////////////////////////////
812void G4UIGainServer::NotifyCommandUpdate(void)
813///////////////////////////////////////
814{
815 G4UIcommandTree * tree = UI->GetTree();
816 SendCommandProperties(tree);
817}
818
819/////////////////////////////////////////////////////
820void G4UIGainServer::NotifyParameterUpdate(G4UIcommand* com)
821/////////////////////////////////////////////////////
822{
823 SendAParamProperty(com);
824}
825
826//////////////////////////////////
827int G4UIGainServer::CommandUpdated(void){
828//////////////////////////////////
829 int added=0, deleted=0;
830 int pEntry= previousTreeCommands.size();
831 int nEntry= newTreeCommands.size();
832 int i,j;
833 for( i=0; i<pEntry; i++) { // check deleted command(s)
834 for( j=0; j<nEntry; j++) {
835 if( previousTreeCommands[i] == newTreeCommands[j]) break;
836 }
837 if( j==nEntry ) {
838 deleted = 1;
839 //G4cout <<"deleted: "<< previousTreeCommands(i) << G4endl;
840 }
841 }
842 for( i=0; i<nEntry; i++) { // check added command(s)
843 for( j=0; j<pEntry; j++) {
844 if( newTreeCommands[i] == previousTreeCommands[j]) break;
845 }
846 if( j==pEntry ) {
847 added = 1;
848 // G4cout <<"added: "<< newTreeCommands(i) << G4endl;
849 }
850 }
851 if( added && deleted==0 ) {G4cout<<"c added"<<G4endl;return added;}
852 if( added==0 && deleted ) {G4cout<<"c deleted"<<G4endl;return deleted;}
853 if( added && deleted ) {G4cout<<"c add/deleted"<<G4endl;return addedAndDeleted;}
854 return notChanged;
855}
856
857//////////////////////////////////////////////////////////////////////
858void G4UIGainServer::GetNewTreeStructure(G4UIcommandTree * tree, int level) {
859//////////////////////////////////////////////////////////////////////
860 G4String commandPath;
861 G4String title;
862 G4String pathName; //tree name
863 G4UIcommandTree * t;
864 int treeEntry = tree->GetTreeEntry();
865 int commandEntry = tree->GetCommandEntry();
866
867 if( level==0 ) { newTreeCommands.clear();}
868 for(int com=0; com<commandEntry; com++){
869 commandPath = tree->GetCommand(com+1)->GetCommandPath();
870 title = tree->GetCommand(com+1)->GetTitle();
871 newTreeCommands.push_back( commandPath + " " + title );
872 }
873
874 if(treeEntry == 0) return; //end recursion
875
876 for(int i=0; i< treeEntry; i++){
877 t = tree->GetTree(i+1);
878 pathName = t->GetPathName();
879 title = t->GetTitle();
880 newTreeCommands.push_back( pathName + " " + title );
881 GetNewTreeStructure(t, level+1);
882 }
883}
884
885////////////////////////////////////
886void G4UIGainServer::UpdateParamVal(void) {
887////////////////////////////////////
888 // call NotifyParameterUpdate() if the value of each
889 // command/parameter is updated.
890 // assuming the command structure is not changed.
891 int pEntry= previousTreeParams.size();
892 int nEntry= newTreeParams.size();
893 int i;
894 G4UIcommand* Comp;
895 if (pEntry != nEntry) return;
896 for( i=0; i<nEntry; i++) {
897 if( previousTreeParams[i] != newTreeParams[i]){
898 Comp = newTreePCP[i];
899 G4cout << Comp->GetCommandPath()
900 << " command is updated." <<G4endl;
901 NotifyParameterUpdate(Comp);
902 }
903 }
904}
905
906//////////////////////////////////////////////////////////////////
907void G4UIGainServer::GetNewTreeValues( G4UIcommandTree * tree, int level){ // recursive
908//////////////////////////////////////////////////////////////////
909 G4String commandPath;
910 G4String pathName; //tree name
911 G4UIcommandTree * t;
912 int parameterEntry;
913 int treeEntry = tree->GetTreeEntry();
914 int commandEntry = tree->GetCommandEntry();
915 G4UIcommand * Comp;
916 G4UIparameter * prp;
917 G4String param, str(" ");
918
919 if( level==0 ) { newTreeParams.clear(); }
920 for(int com=0; com<commandEntry; com++) {
921 Comp = tree->GetCommand(com+1);
922 commandPath = Comp->GetCommandPath();
923 parameterEntry = Comp->GetParameterEntries();
924 param = commandPath +" ";
925 for( int par=0; par< parameterEntry; par++) {
926 prp = (G4UIparameter *)Comp->GetParameter(par);
927 param += prp->GetParameterName() +" ";
928 str(0) = prp->GetParameterType();
929 param += str + " ";
930 param += prp->GetDefaultValue() +" ";
931 param += prp->GetParameterRange() +" ";
932 param += prp->GetParameterCandidates();
933 }
934 newTreeParams.push_back( param + "\n");
935 newTreePCP.push_back( Comp );
936 }
937 if( treeEntry == 0 ) return; // end recursion
938 for( int i=0; i< treeEntry; i++) {
939 t = tree->GetTree(i+1);
940 GetNewTreeValues(t, level+1);
941 }
942}
943
944
945#endif
946
947
948
949
950
951
952
953
954
955
956
957
G4ApplicationState
@ G4State_PreInit
@ FatalException
std::string::size_type str_size
Definition: G4String.hh:57
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
@ addedAndDeleted
@ added
@ deleted
@ notChanged
#define DEFAULT_PORT
#define SOCK_NAME
@ tcl_mode
@ java_mode
@ terminal_mode
@ fParameterOutOfCandidates
@ fCommandNotFound
@ fAliasNotFound
@ fIllegalApplicationState
@ fParameterUnreadable
@ fCommandSucceeded
@ fParameterOutOfRange
#define G4endl
Definition: G4ios.hh:52
#define G4cin
Definition: G4ios.hh:51
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
G4ApplicationState GetCurrentState() const
static G4StateManager * GetStateManager()
G4String GetStateString(G4ApplicationState aState) const
G4String & remove(str_size)
G4String & append(const G4String &)
G4String & prepend(const char *)
str_size index(const char *, G4int pos=0) const
G4bool isNull() const
G4String strip(G4int strip_Type=trailing, char c=' ')
std::istream & readLine(std::istream &, G4bool skipWhite=true)
G4int last(char) const
virtual G4int ReceiveG4cout(const G4String &coutString)
G4UIsession * SessionStart()
G4String GetCommand()
virtual void PauseSessionStart(const G4String &msg)
virtual G4int ReceiveG4cerr(const G4String &cerrString)
G4int GetCommandEntry() const
G4UIcommand * GetCommand(G4int i)
G4int GetTreeEntry() const
const G4String GetPathName() const
G4UIcommandTree * GetTree(G4int i)
void ListCurrentWithNum() const
const G4String GetTitle() const
G4UIcommand * FindPath(const char *commandPath) const
void ListCurrent() const
const G4String & GetGuidanceLine(G4int i) const
Definition: G4UIcommand.hh:132
G4UIparameter * GetParameter(G4int i) const
Definition: G4UIcommand.hh:140
G4int GetGuidanceEntries() const
Definition: G4UIcommand.hh:130
const G4String GetTitle() const
Definition: G4UIcommand.hh:165
const G4String & GetCommandPath() const
Definition: G4UIcommand.hh:134
G4int GetParameterEntries() const
Definition: G4UIcommand.hh:138
G4bool IsAvailable()
Definition: G4UIcommand.cc:269
virtual void List()
Definition: G4UIcommand.cc:328
const G4String & GetRange() const
Definition: G4UIcommand.hh:128
void SetCoutDestination(G4UIsession *const value)
Definition: G4UImanager.cc:517
G4UIcommandTree * GetTree() const
Definition: G4UImanager.hh:197
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:369
G4int GetNumberOfHistory() const
Definition: G4UImanager.hh:220
G4String GetPreviousCommand(G4int i) const
Definition: G4UImanager.hh:222
G4String GetCurrentValues(const char *aCommand)
Definition: G4UImanager.cc:122
G4String SolveAlias(const char *aCmd)
Definition: G4UImanager.cc:316
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:51
void SetSession(G4UIsession *const value)
Definition: G4UImanager.hh:204
G4String GetParameterRange() const
G4String GetDefaultValue() const
G4bool IsOmittable() const
G4String GetParameterCandidates() const
char GetParameterType() const
G4String GetParameterName() const
const G4String GetParameterGuidance() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define TRUE
Definition: globals.hh:55
#define FALSE
Definition: globals.hh:52
#define const
Definition: zconf.h:118