1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
|
// $Id: CommandTasks.cpp 80826 2008-03-04 14:51:23Z wotte $
#include "ace/FILE_Addr.h"
#include "ace/FILE_Connector.h"
#include "ace/FILE_IO.h"
#include "Command.h"
#include "CommandTasks.h"
#include "RecordingDevice_Text.h"
// Listing 011 code/ch18
AnswerCallModule::AnswerCallModule (ACE_SOCK_Stream *peer)
: CommandModule (ACE_TEXT ("AnswerCall Module"),
new AnswerCallDownstreamTask (),
new AnswerCallUpstreamTask (),
peer)
{ }
// Listing 011
// Listing 012 code/ch18
AnswerCallDownstreamTask::AnswerCallDownstreamTask (void)
: CommandTask(Command::CMD_ANSWER_CALL)
{ }
// Listing 012
// Listing 013 code/ch18
int AnswerCallDownstreamTask::process (Command *command)
{
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Answer Call (downstream)\n")));
TextListenerAcceptor *acceptor =
(TextListenerAcceptor *)command->extra_data_;
CommandModule *module =
(CommandModule*)this->module ();
command->numeric_result_ =
acceptor->accept (module->peer ());
acceptor->release ();
return Command::RESULT_SUCCESS;
}
// Listing 013
// Listing 014 code/ch18
AnswerCallUpstreamTask::AnswerCallUpstreamTask (void)
: CommandTask(Command::CMD_ANSWER_CALL)
{ }
// Listing 014
// Listing 015 code/ch18
int AnswerCallUpstreamTask::process (Command *)
{
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Answer Call (upstream)\n")));
return Command::RESULT_SUCCESS;
}
// Listing 015
// Listing 021 code/ch18
RetrieveCallerIdModule::RetrieveCallerIdModule
(ACE_SOCK_Stream *peer)
: CommandModule (ACE_TEXT ("RetrieveCallerId Module"),
new RetrieveCallerIdDownstreamTask (),
new RetrieveCallerIdUpstreamTask (),
peer)
{ }
// Listing 021
// Listing 022 code/ch18
RetrieveCallerIdDownstreamTask::RetrieveCallerIdDownstreamTask
(void)
: CommandTask(Command::CMD_RETRIEVE_CALLER_ID)
{ }
int RetrieveCallerIdDownstreamTask::process (Command *)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Retrieving Caller ID data\n")));
return Command::RESULT_SUCCESS;
}
// Listing 022
// Listing 023 code/ch18
RetrieveCallerIdUpstreamTask::RetrieveCallerIdUpstreamTask
(void)
: CommandTask(Command::CMD_RETRIEVE_CALLER_ID)
{ }
int RetrieveCallerIdUpstreamTask::process (Command *command)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Returning Caller ID data\n")));
ACE_INET_Addr remote_addr;
CommandModule *module =
(CommandModule*)this->module ();
module->peer ().get_remote_addr (remote_addr);
ACE_TCHAR remote_addr_str[256];
remote_addr.addr_to_string (remote_addr_str, 256);
command->result_ = ACE_TString (remote_addr_str);
return Command::RESULT_SUCCESS;
}
// Listing 023
PlayMessageModule::PlayMessageModule (ACE_SOCK_Stream *peer)
: CommandModule (ACE_TEXT ("PlayMessage Module"),
new PlayMessageDownstreamTask (),
new PlayMessageUpstreamTask (),
peer)
{ }
PlayMessageDownstreamTask::PlayMessageDownstreamTask (void)
: CommandTask(Command::CMD_PLAY_MESSAGE)
{ }
// Listing 032 code/ch18
int PlayMessageDownstreamTask::process (Command *command)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Play Outgoing Message\n")));
ACE_FILE_Connector connector;
ACE_FILE_IO file;
ACE_FILE_Addr *addr =
(ACE_FILE_Addr *)command->extra_data_;
if (connector.connect (file, *addr) == -1)
{
command->numeric_result_ = -1;
}
else
{
command->numeric_result_ = 0;
CommandModule *module =
(CommandModule*)this->module ();
char rwbuf[512];
ssize_t rwbytes;
while ((rwbytes = file.recv (rwbuf, 512)) > 0)
{
module->peer ().send_n (rwbuf, rwbytes);
}
}
return Command::RESULT_SUCCESS;
}
// Listing 032
PlayMessageUpstreamTask::PlayMessageUpstreamTask (void)
: CommandTask(Command::CMD_PLAY_MESSAGE)
{ }
int PlayMessageUpstreamTask::process (Command *command)
{
ACE_FILE_Addr * addr =
(ACE_FILE_Addr *)command->extra_data_;
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Outgoing message (%s) sent\n"),
addr->get_path_name ()));
return Command::RESULT_SUCCESS;
}
RecordMessageModule::RecordMessageModule (ACE_SOCK_Stream *peer)
: CommandModule (ACE_TEXT ("RecordMessage Module"),
new RecordMessageDownstreamTask (),
new RecordMessageUpstreamTask (),
peer)
{ }
RecordMessageDownstreamTask::RecordMessageDownstreamTask (void)
: CommandTask(Command::CMD_RECORD_MESSAGE)
{ }
int RecordMessageDownstreamTask::process (Command *)
{
return Command::RESULT_SUCCESS;
}
RecordMessageUpstreamTask::RecordMessageUpstreamTask (void)
: CommandTask(Command::CMD_RECORD_MESSAGE)
{ }
// Listing 033 code/ch18
int RecordMessageUpstreamTask::process (Command *command)
{
// Collect whatever the peer sends and write into the
// specified file.
ACE_FILE_Connector connector;
ACE_FILE_IO file;
ACE_FILE_Addr *addr =
(ACE_FILE_Addr *)command->extra_data_;
if (connector.connect (file, *addr) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("create file")),
Command::RESULT_FAILURE);
file.truncate (0);
CommandModule *module =
(CommandModule*)this->module ();
ssize_t total_bytes = 0;
char rwbuf[512];
ssize_t rwbytes;
while ((rwbytes = module->peer ().recv (rwbuf, 512)) > 0)
{
total_bytes += file.send_n (rwbuf, rwbytes);
}
file.close ();
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("RecordMessageUpstreamTask ")
ACE_TEXT ("- recorded %d byte message\n"),
total_bytes));
return Command::RESULT_SUCCESS;
}
// Listing 033
|