📄 limpc.cxx
字号:
#if defined(HAVE_CONFIG_HXX)
#include "resip/stack/config.hxx"
#endif
#include <cstring>
#include <cassert>
#include <stdio.h>
//#define USE_CURSES
#ifdef USE_CURSES
#include <ncurses.h>
#else
#include <iostream>
#include <cstdio>
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
typedef 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
#endif
char 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::SIP
static 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);
}
bool
processStdin( 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;
}
int
main(int argc, char* argv[])
{
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 int
myMain(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;
}
else if (!strcmp(argv[i],"-prefTls"))
{
prefTls = true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -