⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 answerer.cpp

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 CPP
字号:
/** * Answerer.cpp,v 1.7 2004/10/06 16:27:14 shuston Exp * * Streams Listing 01 * * An answering machine based on a one-way ACE_Stream */#include "ace/OS_NS_string.h"#include "ace/Stream.h"#include "ace/Message_Block.h"#include "ace/FILE_IO.h"#include "MessageInfo.h"#include "Message.h"#include "BasicTask.h"#include "EndTask.h"#include "Util.h"#include "RecordingDevice.h"// Listing 21 code/ch18class AnswerIncomingCall : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("AnswerIncomingCall::process()"));    if (message->recorder ()->answer_call () < 0)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("%p\n"),                         ACE_TEXT ("AnswerIncomingCall")),                        -1);      return 0;  }};// Listing 21// Listing 22 code/ch18class GetCallerId : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("GetCallerId::process()"));    CallerId *id;    id = message->recorder ()->retrieve_callerId ();    if (!id)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("%p\n"),                         ACE_TEXT ("GetCallerId")),                        -1);    message->caller_id (id);    return 0;  }};// Listing 22// Listing 23 code/ch18class PlayOutgoingMessage : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("PlayOutgoingMessage::process()"));    ACE_FILE_Addr outgoing_message =      this->get_outgoing_message (message);    int pmrv =      message->recorder ()->play_message (outgoing_message);    if (pmrv < 0)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("%p\n"),                         ACE_TEXT ("PlayOutgoingMessage")),                        -1);    return 0;  }  ACE_FILE_Addr get_outgoing_message (Message *)  {    // Exclude 23    return ACE_FILE_Addr (ACE_TEXT ("/tmp/outgoing_message"));    // Exclude 23  }};// Listing 23// Listing 24 code/ch18class RecordIncomingMessage : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("RecordIncomingMessage::process()"));    ACE_FILE_Addr incoming_message =      this->get_incoming_message_queue ();    MessageType *type =      message->recorder ()->record_message (incoming_message);    if (!type)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("%p\n"),                         ACE_TEXT ("RecordIncomingMessage")),                        -1);    message->incoming_message (incoming_message, type);    return 0;  }  ACE_FILE_Addr get_incoming_message_queue (void)  {    // Exclude 24    return ACE_FILE_Addr (ACE_TEXT ("/tmp/incoming_message"));    // Exclude 24  }};// Listing 24// Listing 25 code/ch18class ReleaseDevice : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("ReleaseDevice::process()"));    message->recorder ()->release ();    return 0;  }};// Listing 25// Listing 26 code/ch18class EncodeMessage : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("ReleaseDevice::process()"));    ACE_FILE_Addr &incoming = message->addr ();    ACE_FILE_Addr addr = this->get_message_destination (message);    if (message->is_text ())      Util::convert_to_unicode (incoming, addr);    else if (message->is_audio ())      Util::convert_to_mp3 (incoming, addr);    else if (message->is_video ())      Util::convert_to_mpeg (incoming, addr);    message->addr (addr);    return 0;  }  ACE_FILE_Addr get_message_destination (Message *)  {    // Exclude 26    return ACE_FILE_Addr (ACE_TEXT ("/tmp/encoded_message"));    // Exclude 26  }};// Listing 26// Listing 27 code/ch18class SaveMetaData : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("SaveMetaData::process()"));    ACE_TString path (message->addr ().get_path_name ());    path += ACE_TEXT (".xml");    ACE_FILE_Connector connector;    ACE_FILE_IO file;    ACE_FILE_Addr addr (path.c_str ());    if (connector.connect (file, addr) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("%p\n"),                         ACE_TEXT ("create meta-data file")),                        0);    file.truncate (0);    this->write (file, "<Message>\n");    // ...    this->write (file, "</Message>\n");    file.close ();    return 0;  }private:  int write (ACE_FILE_IO &file, const char *str)  {    return file.send (str, ACE_OS::strlen (str));  }};// Listing 27// Listing 28 code/ch18class NotifySomeone : public BasicTask{protected:  virtual int process (Message *message)  {    ACE_TRACE (ACE_TEXT ("NotifySomeone::process()"));    // Format an email to tell someone about the    // newly received message.    // ...    // Display message information in the logfile    ACE_DEBUG ((LM_INFO,                ACE_TEXT ("New message from %s ")                ACE_TEXT ("received and stored at %s\n"),                message->caller_id ()->string (),                message->addr ().get_path_name ()));    return 0;  }};// Listing 28// Listing 10 code/ch18class RecordingStream : public ACE_Stream<ACE_MT_SYNCH>{public:  typedef ACE_Stream<ACE_MT_SYNCH> inherited;  typedef ACE_Module<ACE_MT_SYNCH> Module;  RecordingStream () : inherited()  { }// Listing 10  // Listing 1000 code/ch18  virtual int open (void *arg,                    Module *head = 0, Module *tail = 0)  {    if (tail == 0)      ACE_NEW_RETURN (tail,                      Module (ACE_TEXT ("End Module"), new EndTask ()),                      -1);    this->inherited::open (arg, head, tail);    // Listing 1000    // Listing 1001 code/ch18    Module *answerIncomingCallModule;    ACE_NEW_RETURN (answerIncomingCallModule,                    Module (ACE_TEXT ("Answer Incoming Call"),                            new AnswerIncomingCall ()),                    -1);    // Listing 11 code/ch18    Module *getCallerIdModule;    ACE_NEW_RETURN (getCallerIdModule,                    Module (ACE_TEXT ("Get Caller ID"), new GetCallerId ()),                    -1);    // Listing 11    Module *playOGMModule;    ACE_NEW_RETURN (playOGMModule,                    Module (ACE_TEXT ("Play Outgoing Message"),                            new PlayOutgoingMessage ()),                    -1);    Module *recordModule;    ACE_NEW_RETURN (recordModule,                    Module (ACE_TEXT ("Record Incoming Message"),                            new RecordIncomingMessage ()),                    -1);    Module *releaseModule;    ACE_NEW_RETURN (releaseModule,                    Module (ACE_TEXT ("Release Device"),                            new ReleaseDevice ()),                    -1);    Module *conversionModule;    ACE_NEW_RETURN (conversionModule,                    Module (ACE_TEXT ("Encode Message"),                            new EncodeMessage ()),                    -1);    Module *saveMetaDataModule;    ACE_NEW_RETURN (saveMetaDataModule,                    Module (ACE_TEXT ("Save Meta-Data"),                            new SaveMetaData ()),                    -1);    Module *notificationModule;    ACE_NEW_RETURN (notificationModule,                    Module (ACE_TEXT ("Notify Someone"),                            new NotifySomeone ()),                    -1);    // Listing 1001    // Listing 12 code/ch18    if (this->push (notificationModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n"),                         ACE_TEXT ("notificationModule")),                        -1);    if (this->push (saveMetaDataModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n"),                         ACE_TEXT ("saveMetaDataModule")),                        -1);    if (this->push (conversionModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n"),                         ACE_TEXT ("conversionModule")),                        -1);    if (this->push (releaseModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n"),                         ACE_TEXT ("releaseModule")),                        -1);    if (this->push (recordModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n"),                         ACE_TEXT ("recordModule")),                        -1);    if (this->push (playOGMModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n"),                         ACE_TEXT ("playOGMModule")),                        -1);    if (this->push (getCallerIdModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n"),                         ACE_TEXT ("getCallerIdModule")),                        -1);    if (this->push (answerIncomingCallModule) == -1)      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT ("Failed to push %p\n")                         ACE_TEXT ("answerIncomingCallModule")),                        -1);    // Listing 12    return 0;  }  // Listing 13 code/ch18  int record (RecordingDevice *recorder)  {    ACE_Message_Block * mb;    ACE_NEW_RETURN (mb, ACE_Message_Block (sizeof(Message)), -1);    Message *message = (Message *)mb->wr_ptr ();    mb->wr_ptr (sizeof(Message));    ACE_DEBUG ((LM_DEBUG,                ACE_TEXT ("RecordingStream::record() - ")                ACE_TEXT ("message->recorder(recorder)\n")));    message->recorder (recorder);    int rval = this->put (mb);    ACE_DEBUG ((LM_DEBUG,                ACE_TEXT ("RecordingStream::record() - ")                ACE_TEXT ("this->put() returns %d\n"),                rval));    return rval;  }  // Listing 13};// Listing 1 code/ch18int ACE_TMAIN (int argc, ACE_TCHAR *argv[]){  RecordingDevice *recorder =    RecordingDeviceFactory::instantiate (argc, argv);  // Listing 1  // Listing 2 code/ch18  RecordingStream *recording_stream;  ACE_NEW_RETURN (recording_stream, RecordingStream, -1);  if (recording_stream->open (0) < 0)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("RecordingStream->open()")),                      0);  // Listing 2  // Listing 3 code/ch18  for (;;)    {      ACE_DEBUG ((LM_INFO,                  ACE_TEXT ("Waiting for incoming message\n")));      RecordingDevice *activeRecorder =        recorder->wait_for_activity ();      ACE_DEBUG ((LM_INFO,                  ACE_TEXT ("Initiating recording process\n")));      recording_stream->record (activeRecorder);    }  // Listing 3  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -