📄 limpc.cxx
字号:
#if defined(HAVE_CONFIG_HXX)#include "resip/stack/config.hxx"#endif#include <cstring>#include <cassert>#include <stdio.h>#include <signal.h>//#define USE_CURSES#ifdef USE_CURSES#include <ncurses.h>#else#include <iostream>#include <cstdio>#ifdef WIN32#include <io.h>#else#include <unistd.h>#endiftypedef void WINDOW;// !ah! Really ought to check for ncurses and be a bit better behaved than this.#if !defined(TRUE)#define TRUE true#endif#if !defined(FALSE)#define FALSE false#endifchar ACS_HLINE=1;char ACS_VLINE=2;WINDOW* stdscr=0;WINDOW* newwin(...) { return NULL; };void waddstr(WINDOW*, const char* text) { std::clog << text; };char getch(){ char buf[1]; int r = read(fileno(stdin),&buf,1); if ( r ==1 ) { return buf[0]; } return 0;};void werase(WINDOW*) {};void wrefresh(...) {};void mvhline(...) {};void refresh(...) {};void getmaxyx(...) {};void clearok(...) {};void waddch(...) {};void initscr(...) {};void cbreak(...) {};void noecho(...) {};void nonl(...) {};void intrflush(...) {};void keypad(...) {};void scrollok(...) {};void wmove(...) {};void mvvline(...) {};#endif#ifndef WIN32#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#endif#include "rutil/Socket.hxx"#include "rutil/Logger.hxx"#include "resip/stack/SipStack.hxx"#include "resip/stack/Uri.hxx"#include "resip/stack/TuIM.hxx"#include "resip/stack/Security.hxx"static int myMain(int argc, char* argv[]);using namespace resip;using namespace std;#define RESIPROCATE_SUBSYSTEM Subsystem::SIPstatic WINDOW* commandWin=0;static WINDOW* textWin=0;static WINDOW* statusWin=0;static TuIM* tuIM;static Uri dest;void displayPres(){ werase(statusWin); for( int i=0; i<tuIM->getNumBuddies();i++) { Uri uri = tuIM->getBuddyUri(i); Data status; bool online = tuIM->getBuddyStatus(i,&status); const char* stat = (online)?"online":"offline"; waddstr(statusWin,uri.getAor().c_str()); waddstr(statusWin," "); waddstr(statusWin,stat); waddstr(statusWin," "); waddstr(statusWin,status.c_str()); waddstr(statusWin,"\n"); } wrefresh(statusWin); }class TestCallback: public TuIM::Callback{ public: virtual void presenceUpdate(const Uri& dest, bool open, const Data& status ); virtual void receivedPage( const Data& msg, const Uri& from , const Data& signedBy, SignatureStatus sigStatus, bool wasEncryped ); virtual void sendPageFailed( const Uri& dest,int respNumber ); virtual void registrationFailed(const resip::Uri&, int respNumber); virtual void registrationWorked(const Uri& dest ); virtual void receivePageFailed(const Uri& sender);}; void TestCallback::presenceUpdate(const Uri& from, bool open, const Data& status ){ const char* stat = (open)?"online":"offline"; //cout << from << " set presence to " << stat << " " << status.c_str() << endl; waddstr(textWin,"Status: "); waddstr(textWin, from.getAor().c_str()); waddstr(textWin," is "); waddstr(textWin,stat); waddstr(textWin," "); waddstr(textWin,status.c_str()); waddstr(textWin,"\n"); wrefresh(textWin); displayPres();}void TestCallback::receivedPage( const Data& msg, const Uri& from, const Data& signedBy, SignatureStatus sigStatus, bool wasEncryped ){ //DebugLog(<< "In TestPageCallback"); if ( dest != from ) { dest = from; //cerr << "Set destination to <" << *mDest << ">" << endl; waddstr(textWin,"Set destination to "); waddstr(textWin, Data::from(dest).c_str()); waddstr(textWin,"\n"); } //cout << from; waddstr(textWin,"From: "); waddstr(textWin,from.getAor().c_str()); if ( !wasEncryped ) { //cout << " -NOT SECURE- "; waddstr(textWin," -NOT SECURE-"); } else { waddstr(textWin," -secure-"); } switch ( sigStatus ) { case SignatureSelfSigned: //cout << " -self signed signature (bad)- "; waddstr(textWin,"bad signature"); break; case SignatureIsBad: //cout << " -bad signature- "; waddstr(textWin,"bad signature"); break; case SignatureNone: //cout << " -no signature- "; waddstr(textWin,"no signature"); break; case SignatureTrusted: //cout << " <signed " << signedBy << " > "; waddstr(textWin,"signed "); waddstr(textWin,signedBy.c_str()); break; case SignatureCATrusted: //cout << " <ca signed " << signedBy << " > "; waddstr(textWin,"ca signed " ); waddstr(textWin,signedBy.c_str()); break; case SignatureNotTrusted: //cout << " <signed " << signedBy << " NOT TRUSTED > "; waddstr(textWin,"untrusted signature "); waddstr(textWin,signedBy.c_str()); break; } //cout << " says:" << endl; //cout << msg.escaped() << endl; waddstr(textWin, " says: "); waddstr(textWin, msg.escaped().c_str() ); waddstr(textWin, "\n"); wrefresh(textWin);}void TestCallback::sendPageFailed( const Uri& target, int respNum ){ //InfoLog(<< "In TestErrCallback"); // cerr << "Message to " << dest << " failed" << endl; Data num(respNum); waddstr(textWin,"Message to "); waddstr(textWin, Data::from(target).c_str()); waddstr(textWin," failed ("); waddstr(textWin,num.c_str()); waddstr(textWin," response)\n"); wrefresh(textWin);}void TestCallback::receivePageFailed( const Uri& target ){ //InfoLog(<< "In TestErrCallback"); // cerr << "Message to " << dest << " failed" << endl; waddstr(textWin,"Can not understand messager from "); waddstr(textWin, Data::from(target).c_str()); waddstr(textWin,"\n"); wrefresh(textWin);}void TestCallback::registrationFailed(const resip::Uri& target, int respNum ){ Data num(respNum); waddstr(textWin,"Registration to "); waddstr(textWin, Data::from(target).c_str()); waddstr(textWin," failed ("); waddstr(textWin,num.c_str()); waddstr(textWin," response)\n"); wrefresh(textWin);} void TestCallback::registrationWorked(const resip::Uri& target){ waddstr(textWin,"Registration to "); waddstr(textWin, Data::from(target).c_str()); waddstr(textWin," worked"); wrefresh(textWin);} boolprocessStdin( Uri* dest, bool sign, bool encryp ){ static unsigned int num=0; static char buf[1024]; char c = getch(); if ( c == 0 ) { return true; } if ( c == '\f' ) { clearok(textWin,TRUE); clearok(statusWin,TRUE); clearok(commandWin,TRUE); assert( num < sizeof(buf) ); buf[num] = 0; werase(commandWin); waddstr(commandWin,buf); wrefresh(textWin); wrefresh(statusWin); wrefresh(commandWin); return true; }#if 0 char junk[6]; junk[0]=' '; junk[1]='0'+(c/100); junk[2]='0'+((c/10)%10); junk[3]='0'+(c%10); junk[4]=' '; junk[5]=0; waddstr(commandWin,junk);#endif if ( (c == '\a') || (c == '\b') || (c == 4 ) || (c == 0x7F) ) { if ( num > 0 ) { num--; } buf[num]=0; werase(commandWin); waddstr(commandWin,buf); wrefresh(commandWin); return true; } if ( (c == '\r') || (c == '\n') || (num+2>=sizeof(buf)) ) { buf[num] =0; if ( (num>3) && (!strncmp("to:",buf,3)) ) { buf[num] = 0; *dest = Uri(Data(buf+3)); //cerr << "Set destination to <" << *dest << ">"; waddstr(textWin,"Set destination to "); waddstr(textWin, Data::from(*dest).c_str()); waddstr(textWin,"\n"); wrefresh(textWin); } else if ( (num>4) && (!strncmp("add:",buf,4)) ) { buf[num] = 0; Uri uri(Data(buf+4)); //cerr << "Subscribing to buddy <" << uri << ">"; waddstr(textWin, "Subscribing to "); waddstr(textWin, Data::from(uri).c_str()); waddstr(textWin, "\n"); wrefresh(textWin); tuIM->addBuddy( uri, Data::Empty ); displayPres(); } else if ( (num>=7) && (!strncmp("status:",buf,7)) ) { buf[num] = 0; Data stat(buf+7); //cerr << "setting presence status to <" << stat << ">"; waddstr(textWin,"Set presece status to <"); waddstr(textWin,stat.c_str()); waddstr(textWin,">\n"); wrefresh(textWin); tuIM->setMyPresence( !stat.empty(), stat ); } else if ( (num==1) && (!strncmp(".",buf,1)) ) { //DebugLog( << "Got a period - end program" ); return false; } else { if ( num >= 1 ) { assert( num < sizeof(buf) ); buf[num] = 0; Data text(buf); Data destValue = dest->getAor(); DebugLog( << "Destination is " << destValue ); Data encFor = Data::Empty; if (encryp) { encFor = dest->getAorNoPort(); } DebugLog( << "Destination encrypt for is " << encFor ); if ( tuIM->haveCerts(sign,encFor) ) { waddstr(textWin,"To: "); waddstr(textWin,destValue.c_str()); waddstr(textWin," "); waddstr(textWin,text.c_str()); waddstr(textWin,"\n"); wrefresh(textWin); tuIM->sendPage( text , *dest, sign , encFor ); } else { waddstr(textWin,"Don't have aproperate certificates to sign and encrypt a message to "); waddstr(textWin,destValue.c_str()); waddstr(textWin,"\n"); wrefresh(textWin); } } } num = 0; werase(commandWin); wrefresh(commandWin); } else { buf[num++] = c; assert( num < sizeof(buf) ); waddch(commandWin,c); wrefresh(commandWin); } return true;}intmain(int argc, char* argv[]){#ifndef _WIN32 if ( signal( SIGPIPE, SIG_IGN) == SIG_ERR) { cerr << "Couldn't install signal handler for SIGPIPE" << endl; exit(-1); }#endif int r; try { r = myMain( argc, argv ); } catch( ... ) { ErrLog( << "Got a exception passed all the way to the top of limp" ); exit(-1); } return r;}static intmyMain(int argc, char* argv[]){ Log::initialize(Log::Cerr, Log::Err, argv[0]); Log::setLevel(Log::Warning); InfoLog(<<"Test Driver for IM Starting"); int port = 5060; int tlsPort = 0; int dtlsPort = 0; Uri aor; bool haveAor=false; dest = Uri("sip:nobody@example.com"); Data aorPassword; Uri contact("sip:user@"); bool haveContact=false; Uri outbound; bool noRegister = false; Data tlsDomain = Data::Empty; Data sendMsg = Data::Empty; int numAdd=0; Data addList[100]; int numPub=0; Data pubList[100]; bool encryp=false; bool sign=false; Data key("password"); bool useTls = true; bool noTls = false; bool noTcp = false; bool prefUdp = false; bool prefTls = false; bool prefDtls = false; bool prefTcp = false; bool noUdp = false; bool noV6 = false; bool noV4 = false; bool genUserCert = false; for ( int i=1; i<argc; i++) { if (!strcmp(argv[i],"-vv")) { Log::setLevel(Log::Stack); } else if (!strcmp(argv[i],"-v")) { Log::setLevel(Log::Info); } else if (!strcmp(argv[i],"-encrypt")) { encryp = true; } else if (!strcmp(argv[i],"-genUserCert")) { genUserCert = true; } else if (!strcmp(argv[i],"-noRegister")) { noRegister = true; } else if (!strcmp(argv[i],"-sign")) { sign = true; } else if (!strcmp(argv[i],"-tlsDomain")) { i++; assert( i<argc ); tlsDomain = Data(argv[i]); } else if (!strcmp(argv[i],"-ssl")) { useTls = false; } else if (!strcmp(argv[i],"-noTcp")) { noTcp = true; } else if (!strcmp(argv[i],"-noTls")) { noTls = true; } else if (!strcmp(argv[i],"-noUdp")) { noUdp = true; } else if (!strcmp(argv[i],"-prefTcp")) { prefTcp = true; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -