📄 tuim.cxx
字号:
Uri from = msg->header(h_From).uri();
DebugLog ( << "got notify from " << from );
Contents* contents = msg->getContents();
if ( !contents )
{
InfoLog(<< "Received NOTIFY message event with no contents" );
mCallback->presenceUpdate( from, true, Data::Empty );
return;
}
Mime mime = contents->getType();
DebugLog ( << "got NOTIFY event with body of type " << mime.type() << "/" << mime.subType() );
Pidf* body = dynamic_cast<Pidf*>(contents);
if ( !body )
{
InfoLog(<< "Received NOTIFY message event with no PIDF contents" );
mCallback->presenceUpdate( from, true, Data::Empty );
return;
}
Data note;
bool open = body->getSimpleStatus( ¬e );
bool changed = true;
// update if found in budy list
for ( BuddyIterator i=mBuddies.begin(); i != mBuddies.end(); i++)
{
Uri u = i->uri; // getBuddyUri(i);
if ( u.getAor() == from.getAor() )
{
if ( (i->status == note) &&
(i->online == open) )
{
changed = false;
}
i->status = note;
i->online = open;
}
}
InfoLog(<< "Processed NOTIFY message : Presence changed: " << changed );
// notify callback
if (changed)
{
assert(mCallback);
mCallback->presenceUpdate( from, open, note );
}
}
void
TuIM::processMessageRequest(SipMessage* msg)
{
assert( msg );
assert( msg->header(h_RequestLine).getMethod() == MESSAGE );
NameAddr contact;
contact.uri() = mContact;
SipMessage* response = Helper::makeResponse(*msg, 200, contact, "OK");
mStack->send( *response );
delete response; response=0;
Contents* contents = msg->getContents();
if ( !contents )
{
InfoLog(<< "Received Message message with no contents" );
delete msg; msg=0;
return;
}
assert( contents );
Mime mime = contents->getType();
DebugLog ( << "got body of type " << mime.type() << "/" << mime.subType() );
Data signedBy;
SignatureStatus sigStat = SignatureNone;
bool encrypted=false;
#if defined( USE_SSL )
Uri from = msg->header(h_From).uri();
signedBy = from.getAorNoPort();
InfoLog ( << "assuming signedBy is " << signedBy );
MultipartSignedContents* mBody = dynamic_cast<MultipartSignedContents*>(contents);
if ( mBody )
{
Security* sec = mStack->getSecurity();
assert(sec);
contents = sec->checkSignature( mBody, &signedBy, &sigStat );
//ErrLog("Signed by " << signedBy << " stat = " << sigStat );
if ( !contents )
{
Uri from = msg->header(h_From).uri();
InfoLog( << "Some problem decoding multipart/signed message");
mCallback->receivePageFailed( from );
return;
}
}
Pkcs7SignedContents* sBody = dynamic_cast<Pkcs7SignedContents*>(contents);
if ( sBody )
{
assert( sBody );
Security* sec = mStack->getSecurity();
assert(sec);
contents = sec->decrypt( mAor.getAor(), sBody );
if ( !contents )
{
Uri from = msg->header(h_From).uri();
InfoLog( << "Some problem decoding signed SMIME message");
mCallback->receivePageFailed( from );
return;
}
encrypted=true;
}
Pkcs7Contents* eBody = dynamic_cast<Pkcs7Contents*>(contents);
if ( eBody )
{
assert( eBody );
Security* sec = mStack->getSecurity();
assert(sec);
contents = sec->decrypt( mAor.getAor(), eBody );
if ( !contents )
{
Uri from = msg->header(h_From).uri();
InfoLog( << "Some problem decoding SMIME message");
mCallback->receivePageFailed( from );
return;
}
encrypted=true;
}
#endif
if ( contents )
{
PlainContents* plain = dynamic_cast<PlainContents*>(contents);
if ( plain )
{
assert( plain );
const Data& text = plain->text();
DebugLog ( << "got message from with text of <" << text << ">" );
Uri from = msg->header(h_From).uri();
DebugLog ( << "got message from " << from );
assert( mCallback );
mCallback->receivedPage( text, from, signedBy, sigStat, encrypted );
return;
}
CpimContents* cpim = dynamic_cast<CpimContents*>(contents);
if ( cpim )
{
assert( cpim );
const Data& text = cpim->text();
DebugLog ( << "got CPIM message from with text of <" << text << ">" );
// !cj! TODO - should get from out of CPIM message
Uri from = msg->header(h_From).uri();
DebugLog ( << "got message from " << from );
assert( mCallback );
mCallback->receivedPage( text, from, signedBy, sigStat, encrypted );
return;
}
MultipartMixedContents* mixed = dynamic_cast<MultipartMixedContents*>(contents);
if ( mixed )
{
InfoLog( << "Got a multipart mixed" );
contents = NULL;
MultipartMixedContents::Parts& parts = mixed->parts();
for( MultipartMixedContents::Parts::const_iterator i = parts.begin();
i != parts.end();
++i)
{
Contents* c = *i;
assert( c );
InfoLog ( << "mixed has a " << c->getType() );
if ( c->getType() == Mime("text","plain") )
{
InfoLog ( << "mixed has sipfrag " << c->getType() );
PlainContents* plainBody = dynamic_cast<PlainContents*>(c);
if ( plainBody )
{
assert( plainBody );
const Data& text = plainBody->text();
DebugLog ( << "got message from with text of <" << text << ">" );
Uri from = msg->header(h_From).uri();
DebugLog ( << "got message from " << from );
assert( mCallback );
mCallback->receivedPage( text, from, signedBy, sigStat, encrypted );
return;
}
// !cj! TODO - should deal with CPIM too
}
}
return;
}
#if 1 // !cj! TODO remove
OctetContents* octets = dynamic_cast<OctetContents*>(contents);
if (octets)
{
assert( contents );
const Data& text = octets->getBodyData();
DebugLog ( << "got message from with text of <" << text << ">" );
Uri from = msg->header(h_From).uri();
DebugLog ( << "got message from " << from );
assert( mCallback );
mCallback->receivedPage( text, from, signedBy, sigStat, encrypted );
return;
}
#endif
// deal with it if no one else has
{
InfoLog ( << "Can not handle type " << contents->getType() );
Uri from = msg->header(h_From).uri();
mCallback->receivePageFailed( from );
return;
}
}
}
void
TuIM::processResponse(SipMessage* msg)
{
assert( msg->exists(h_CallId));
CallId id = msg->header(h_CallId);
assert( id.value() != Data::Empty );
processSipFrag( msg );
// see if it is a registraition response
CallId regId = mRegistrationDialog.getCallId();
Data v1 = id.value();
Data v2 = regId.value();
InfoLog( << "want id =" << id );
if ( id == regId )
{
InfoLog ( << "matched the reg dialog"
<< mRegistrationDialog.getCallId() << " = " << id );
processRegisterResponse( msg );
return;
}
// see if it is a subscribe response
for ( BuddyIterator i=mBuddies.begin(); i != mBuddies.end(); i++)
{
Buddy& buddy = *i;
assert( buddy.presDialog );
InfoLog( << "check buddy id =" << buddy.presDialog->getCallId() );
if ( buddy.presDialog->getCallId() == id )
{
DebugLog ( << "matched the subscribe dialog" );
processSubscribeResponse( msg, buddy );
return;
}
}
// see if it is a publish response
for ( StateAgentIterator i=mStateAgents.begin(); i != mStateAgents.end(); i++)
{
assert( i->dialog );
InfoLog( << "check publish id =" << i->dialog->getCallId() );
if ( i->dialog->getCallId() == id )
{
DebugLog ( << "matched the publish dialog" );
processPublishResponse( msg, *i );
return;
}
}
// see if it is a notify response
for ( SubscriberIterator i=mSubscribers.begin(); i != mSubscribers.end(); i++)
{
DeprecatedDialog* dialog = i->dialog;
assert( dialog );
InfoLog( << "check subscriber id =" << dialog->getCallId() );
if ( dialog->getCallId() == id )
{
DebugLog ( << "matched the notify dialog" );
processNotifyResponse( msg, *dialog );
return;
}
}
// see if it is a page response
for ( PageIterator i=mPages.begin(); i != mPages.end(); i++)
{
assert( i->dialog );
InfoLog( << "check page id =" << i->dialog->getCallId() );
if ( i->dialog->getCallId() == id )
{
DebugLog ( << "matched the MESSAGE dialog" );
processPageResponse( msg, *i );
return;
}
}
int number = msg->header(h_StatusLine).responseCode();
InfoLog( << "got response that DID NOT MATCH of type " << number );
}
void
TuIM::processRegisterResponse(SipMessage* msg)
{
int number = msg->header(h_StatusLine).responseCode();
Uri to = msg->header(h_To).uri();
InfoLog ( << "register of " << to << " got response " << number );
unsigned int cSeq = msg->header(h_CSeq).sequence();
if ( number<200 )
{
return;
}
if ( number >= 200 )
{
mRegistrationDialog.createDialogAsUAC( *msg );
}
if ( ((number == 401) || (number == 407)) && (cSeq != mLastAuthCSeq) )
{
SipMessage* reg = mRegistrationDialog.makeRegister();
const Data cnonce = Data::Empty;
unsigned int nonceCount=0;
Helper::addAuthorization(*reg,*msg,mAor.user(),mRegistrationPassword,cnonce,nonceCount);
mLastAuthCSeq = reg->header(h_CSeq).sequence();
reg->header(h_Expires).value() = mRegistrationTimeSeconds;
reg->header(h_Contacts).front().param(p_expires) = mRegistrationTimeSeconds;
mNextTimeToRegister = Timer::getRandomFutureTimeMs( mRegistrationTimeSeconds*1000 );
InfoLog( << *reg );
setOutbound( *reg );
mStack->send( *reg );
delete reg; reg=NULL;
return;
}
if ( number >= 300 )
{
assert( mCallback );
mCallback->registrationFailed( to, number );
return;
}
if ( (number>=200) && (number<300) )
{
int expires = mRegistrationTimeSeconds;
if ( msg->exists(h_Expires) )
{
expires = msg->header(h_Expires).value();
}
// loop throught the contacts, find me, and extract expire time
resip::ParserContainer<resip::NameAddr>::iterator i = msg->header(h_Contacts).begin();
while ( i != msg->header(h_Contacts).end() )
{
try
{
Uri uri = i->uri();
if ( uri.getAor() == mContact.getAor() )
{
int e = i->param(p_expires);
DebugLog(<< "match " << uri.getAor() << " e=" << e );
expires = e;
}
}
catch ( exception* )
{
InfoLog(<< "Bad contact in 2xx to register - skipped" );
}
i++;
}
if ( expires < 15 )
{
InfoLog(<< "Got very small expiers of " << expires );
expires = 15;
}
mNextTimeToRegister = Timer::getRandomFutureTimeMs( expires*1000 );
mCallback->registrationWorked( to );
return;
}
}
void
TuIM::processNotifyResponse(SipMessage* msg, DeprecatedDialog& d )
{
int number = msg->header(h_StatusLine).responseCode();
DebugLog( << "got NOTIFY response of type " << number );
if ( number >= 300 )
{
// TODO
}
}
void
TuIM::processPublishResponse(SipMessage* msg, StateAgent& sa )
{
int number = msg->header(h_StatusLine).responseCode();
DebugLog( << "got PUBLISH response of type " << number );
if ( number >= 300 )
{
// TODO
}
}
void
TuIM::processPageResponse(SipMessage* msg, Page& page )
{
int number = msg->header(h_StatusLine).responseCode();
DebugLog( << "got MESSAGE response of type " << number );
if ( number >= 400 )
{
Uri dest = msg->header(h_To).uri();
assert( mCallback );
mCallback->sendPageFailed( dest,number );
}
if ( (number>=300) && (number<400) )
{
ParserContainer<NameAddr>::iterator dest = msg->header(h_Contacts).begin();
while ( dest != msg->header(h_Contacts).end() )
{
DebugLog(<< "Got a 3xx to" << *dest );
// send a message to redirected location
Uri uri = dest->uri();
sendPage( page.text, uri, page.sign, page.encryptFor );
dest++;
}
}
if ( (number>=200) && (number<300) )
{
// got a final response for notify - can remove this dialog information
CallId id = msg->header(h_CallId);
for( PageIterator i=mPages.begin(); i != mPages.end(); i++ )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -