right  Talk To Us!

simple send fax Sample

A simple outbound application that starts a fax session on an outbound call and sends the contents of a tif file (myFax.tif).

A progress page is set so that the application can present the negotiated fax settings and a page count after each page has been sent. A next page is set so that the application can present the fax termination result.

This application requires the tif file myFax.tif to be available in the cloud media store.

Use actions: Send Fax

    • {
          "actions" :
          [
              {
                  "send_fax" :
                  {
                      "fax_to_send": "myFax.tif",
                      "next_page"  :
                      {
                          "url"    : "SendFaxComplete",
                          "method" : "Post"
                      }
                      "progress_page":
                      {
                          "url"    : "FaxProgress",
                          "method" : "Post"
                      }
                  }
              }
          ],
          "token" : "my instance id"
      }
      
    • {
          [
          ],
          "token" : "Error for Action: xxxx  ActionIndex: xxxx  Result: xxxx"
      }
      
    • {
      }
      
  • Implemented as ASP.Net Web Forms:

    • using System;
      using System.Collections.Generic;
      using RestAPIWrapper;
      
      public partial class SimpleSendFax : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(Request);
              if (!ourRequest.IsValid)
              {
                  return;
              }
      
              // Setup the actions
              List<TelephonyAction> actions = new List<TelephonyAction>();
              actions.Add(new SendFax("myFax.tif", new WebPageRequest("SendFaxComplete.aspx"), new WebPageRequest("SendFaxProgress.aspx")));
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(actions, "my send fax instance id");
              ourResponse.ToHttpResponse(Response);
          }
      }
      
    • using System;
      using System.Collections.Generic;
      using RestAPIWrapper;
      
      public partial class SendFaxProgress : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(Request);
              if (!ourRequest.IsValid)
              {
                  return;
              }
              String token = ourRequest.InstanceInfo.Token;
              SendFaxProgress progress = (SendFaxProgress)ourRequest.InstanceInfo.ActionProgress;
      
              // Add your own code here to use the progress information.
              // e.g. update a database, write to a log...
              int pagesSent = progress.PagesSent;
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(token);
              ourResponse.ToHttpResponse(Response);
          }
      }
      
      
    • using System;
      using System.Collections.Generic;
      using RestAPIWrapper;
      
      public partial class SendFaxComplete : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(Request);
              if (!ourRequest.IsValid)
              {
                  return;
              }
              String token = ourRequest.InstanceInfo.Token;
              SendFaxResult result = (SendFaxResult)ourRequest.InstanceInfo.ActionResult;
      
              // Add your own code here to use the result information.
              // e.g. update a database, write to a log...
              int pagesSent = result.PagesSent;
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(token);
              ourResponse.ToHttpResponse(Response);
          }
      }
      
      
    • using System;
      using System.Collections.Generic;
      using RestAPIWrapper;
      
      public partial class ErrorPage : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(Request);
              if (!ourRequest.IsValid)
              {
                  return;
              }
              ErrorResult result = ourRequest.InstanceInfo.ErrorResult;
      
              String token = String.Format("Action: {0}\nActionIndex: {1}\nResult: {2}",
                  result.Action, result.ActionIndex, result.Result);
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(null, token);
              ourResponse.ToHttpResponse(Response);
          }
      }
      
    • using System;
      using System.Collections.Generic;
      using RestAPIWrapper;
      
      public partial class FinalPage : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(Request);
              if (!ourRequest.IsValid)
              {
                  return;
              }
          }
      }
      
  • Implemented as ASP.Net Web Forms:

    • Imports System
      Imports System.Collections.Generic
      Imports RestAPIWrapper
      
      Partial Class SimpleSendFax
          Inherits System.Web.UI.Page
      
          Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
      
              ' Unpack the request
              Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
              If Not ourRequest.IsValid Then
                  Return
              End If
      
              ' Setup the actions
              Dim actions As List(Of TelephonyAction) = New List(Of TelephonyAction)
              actions.Add(New SendFax("myFax.tif", New WebPageRequest("SendFaxComplete.aspx"), New WebPageRequest("SendFaxProgress.aspx")))
      
              ' Respond
              Dim ourResponse As TelephonyResponse = New TelephonyResponse(actions, "my send fax instance id")
              ourResponse.ToHttpResponse(Response)
          End Sub
      End Class
      
    • Imports System
      Imports System.Collections.Generic
      Imports RestAPIWrapper
      
      Partial Class SendFaxProgress
          Inherits System.Web.UI.Page
      
          Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
      
              ' Unpack the request
              Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
              If Not ourRequest.IsValid Then
                  Return
              End If
              Dim token As String = ourRequest.InstanceInfo.Token
              Dim progress As RestAPIWrapper.SendFaxProgress = ourRequest.InstanceInfo.ActionProgress
      
              ' Add your own code here to use the progress information.
              ' e.g. update a database, write to a log...
              Dim pagesSent As Integer = progress.PagesSent
      
              ' Respond
              Dim ourResponse As TelephonyResponse = New TelephonyResponse(token)
              ourResponse.ToHttpResponse(Response)
          End Sub
      End Class
      
    • Imports System
      Imports System.Collections.Generic
      Imports RestAPIWrapper
      
      Partial Class SendFaxComplete
          Inherits System.Web.UI.Page
      
          Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
      
              ' Unpack the request
              Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
              If Not ourRequest.IsValid Then
                  Return
              End If
              Dim token As String = ourRequest.InstanceInfo.Token
              Dim result As SendFaxResult = ourRequest.InstanceInfo.ActionResult
      
              ' Add your own code here to use the result information.
              ' e.g. update a database, write to a log...
              Dim pagesSent As Integer = result.PagesSent
      
              ' Respond
              Dim ourResponse As TelephonyResponse = New TelephonyResponse(token)
              ourResponse.ToHttpResponse(Response)
          End Sub
      End Class
      
    • Imports System
      Imports System.Collections.Generic
      Imports RestAPIWrapper
      
      Partial Class ErrorPage
          Inherits System.Web.UI.Page
      
          Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
      
              ' Unpack the request
              Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
              If Not ourRequest.IsValid Then
                  Return
              End If
              Dim result As ErrorResult = ourRequest.InstanceInfo.ErrorResult
      
              Dim token As String = String.Format("Action: {0}\nActionIndex: {1}\nResult: {2}", _
                  result.Action, result.ActionIndex, result.Result)
      
              ' Respond
              Dim ourResponse As TelephonyResponse = New TelephonyResponse(token)
              ourResponse.ToHttpResponse(Response)
          End Sub
      End Class
      
    • Imports System
      Imports System.Collections.Generic
      Imports RestAPIWrapper
      
      Partial Class FinalPage
          Inherits System.Web.UI.Page
      
          Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
      
              ' Unpack the request
              Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
              If Not ourRequest.IsValid Then
                  Return
              End If
          End Sub
      End Class
      
  • Implemented as Java Servlets:

    • package com.aculab.telephonyrestapi.samples;
      
      import javax.servlet.http.*;
      import javax.servlet.ServletException;
      import java.io.IOException;
      import com.aculab.telephonyrestapi.*;
      
      public class SimpleSendFax extends HttpServlet
      {
          @Override
          public void doPost(HttpServletRequest request,
                             HttpServletResponse response) throws IOException, ServletException
          {
          	handleRequest(request, response);
          }
      
          @Override
          public void doGet(HttpServletRequest request,
                            HttpServletResponse response) throws IOException, ServletException
          {
             	handleRequest(request, response);
          }
      
          private void handleRequest(HttpServletRequest request,
                                     HttpServletResponse response) throws IOException
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(request);
              if (!ourRequest.isValid())
              {
                  return;
              }
      
              // Setup the actions
              List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
              actions.add(new SendFax("myFax.tif", new WebPageRequest("SendFaxComplete"), new WebPageRequest("SendFaxProgress")));
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(actions, "my send fax instance id");
              ourResponse.setHttpServletResponse(response);
          }
      }
      
    • package com.aculab.telephonyrestapi.samples;
      
      import javax.servlet.http.*;
      import javax.servlet.ServletException;
      import java.io.IOException;
      import com.aculab.telephonyrestapi.*;
      
      public class SendFaxProgress extends HttpServlet
      {
          @Override
          public void doPost(HttpServletRequest request,
                             HttpServletResponse response) throws IOException, ServletException
          {
          	handleRequest(request, response);
          }
      
          @Override
          public void doGet(HttpServletRequest request,
                            HttpServletResponse response) throws IOException, ServletException
          {
             	handleRequest(request, response);
          }
      
          private void handleRequest(HttpServletRequest request,
                                     HttpServletResponse response) throws IOException
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(request);
              if (!ourRequest.isValid())
              {
                  return;
              }
              String token = ourRequest.getInstanceInfo().getToken();
              SendFaxProgress result = (SendFaxProgress)ourRequest.getInstanceInfo().getActionProgress();
      
              // Add your own code here to use the progress information.
              // e.g. update a database, write to a log...
              int pagesSent = progress.getPagesSent();
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(token);
              ourResponse.setHttpServletResponse(response);
          }
      }
      
    • package com.aculab.telephonyrestapi.samples;
      
      import javax.servlet.http.*;
      import javax.servlet.ServletException;
      import java.io.IOException;
      import com.aculab.telephonyrestapi.*;
      
      public class SendFaxComplete extends HttpServlet
      {
          @Override
          public void doPost(HttpServletRequest request,
                             HttpServletResponse response) throws IOException, ServletException
          {
          	handleRequest(request, response);
          }
      
          @Override
          public void doGet(HttpServletRequest request,
                            HttpServletResponse response) throws IOException, ServletException
          {
             	handleRequest(request, response);
          }
      
          private void handleRequest(HttpServletRequest request,
                                     HttpServletResponse response) throws IOException
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(request);
              if (!ourRequest.isValid())
              {
                  return;
              }
              String token = ourRequest.getInstanceInfo().getToken();
              SendFaxResult result = (SendFaxResult)ourRequest.getInstanceInfo().getActionResult();
      
              // Add your own code here to use the result information.
              // e.g. update a database, write to a log...
              int pagesSent = result.getPagesSent();
      
              // Respond
              TelephonyResponse ourResponse = new TelephonyResponse(token);
              ourResponse.setHttpServletResponse(response);
          }
      }
      
    • package com.aculab.telephonyrestapi.samples;
      
      import javax.servlet.http.*;
      import javax.servlet.ServletException;
      import java.io.IOException;
      import java.util.ArrayList;
      import java.util.List;
      
      import com.aculab.telephonyrestapi.*;
      
      public class ErrorPage extends HttpServlet
      {
          private static final long serialVersionUID = -4842873371047361437L;
      
          @Override
          public void doGet(HttpServletRequest request,
                            HttpServletResponse response)
              throws IOException, ServletException
          {
             	handleRequest(request, response);
          }
      
          @Override
          public void doPost(HttpServletRequest request,
                  HttpServletResponse response)
                          throws IOException, ServletException
          {
          	handleRequest(request, response);
          }
      
          private void handleRequest(HttpServletRequest request,
                                     HttpServletResponse response) throws IOException
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(request);
              if (!ourRequest.isValid())
              {
                  return;
              }
              ErrorResult result = ourRequest.getInstanceInfo().getErrorResult();
      
              String token = String.format("Action: %s\nActionIndex: %d\nResult: %s", result.getAction(), result.getActionIndex(), result.getResult());
      
              // Respond
              List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
              TelephonyResponse ourResponse = new TelephonyResponse(actions, token);
              ourResponse.setHttpServletResponse(response);
          }
      }
      
    • package com.aculab.telephonyrestapi.samples;
      
      import javax.servlet.http.*;
      import javax.servlet.ServletException;
      import java.io.IOException;
      import com.aculab.telephonyrestapi.*;
      
      public class FinalPage extends HttpServlet
      {
          private static final long serialVersionUID = 5940620014313056844L;
      
          @Override
          public void doGet(HttpServletRequest request,
                            HttpServletResponse response)
              throws IOException, ServletException
          {
             	handleRequest(request, response);
          }
      
          @Override
          public void doPost(HttpServletRequest request,
                  HttpServletResponse response)
                          throws IOException, ServletException
          {
          	handleRequest(request, response);
          }
      
          private void handleRequest(HttpServletRequest request,
                                     HttpServletResponse response) throws IOException
          {
              // Unpack the request
              TelephonyRequest ourRequest = new TelephonyRequest(request);
              if (!ourRequest.isValid())
              {
                  return;
              }
          }
      }
      
  • Implemented using a wrapper for Python's wsgiref.simple_server.

    For the purposes of this sample, the first page is first_page, the final page is final_page and the error page is error_page.
    • The application base class.

      from aculab.telephony_rest_api import Play
      
      class ApplicationBase:
      
          def __init__(self, exit=None):
              self.exit = exit or [self.exit]
      
      
          def exit(self):
              pass
      
      
          def error_page(self, my_actions, query_info):
              try:
                  error_result = query_info.ErrorResult
                  action = error_result.get('action', 'none')
                  print("\nError {0} : {1}\n".format(action, error_result['result']))
                  my_actions.add(Play(text_to_say='I encountered an error.'))
      
              except Exception as exc:
                  print("Error page exception: {0}".format(exc))
              return True
      
      
          def final_page(self, my_actions, query_info):
              try:
                  tcall = query_info.ThisCall
                  if tcall:
                      print("This call ID         : {0}".format(tcall.get('call_id')))
                      print("This call duration   : {0}".format(tcall.get('seconds_call_duration')))
                  self.exit[0]()
              except Exception as exc:
                  print("Final page exception: {0}".format(exc))
              return True
      
      
          def unknown_page(self, my_actions, query_info):
              try:
                  my_actions.add(Play(text_to_say='I find myself on an unknown page.'))
              except Exception as exc:
                  print("Unknown page exception: {0}".format(exc))
              return True
      
    • The application code.

      # This is an outbound application and, as such, needs to be invoked by the web services API.
      # It uses a Python wrapper for the web services API to invoke this sample.
      # Before running this sample you will need to configure an outbound service that points to it.
      
      import sys, os
      from threading import Thread
      from getpass import getpass
      sys.path.append(os.path.abspath('../..'))
      
      from aculab.telephony_rest_api import *
      from aculab.simple_server import *
      from aculab.base_application import ApplicationBase
      from aculab.web_services import invoke_outbound_service
      
      
      if sys.version > '3':
          def raw_input(text):
              return input(text)
      
      
      class MyThread(Thread):
          def __init__(self, function):
              Thread.__init__(self)
              self._function = function
              self.return_code = 0
      
          def run(self):
              self.return_code = self._function()
      
      
      class Application(ApplicationBase):
      
          def __init__(self):
              ApplicationBase.__init__(self)
      
      
          def responder(self, query, start_response):
      
              query_info = RESTQuery(query)
              page = query_info.Page
      
              my_actions = Actions(token='send fax sample')
              
              # on your outbound service, set the first page entry to point to this page
              # e.g., http://<ip address>:<port>/first_page
              if 'first_page' == page:
                  fax_action = SendFax(fax_to_send='myFax.tif',
                                       progress_page=WebPage(url='fax_progress_page', method='POST'),
                                       next_page=WebPage(url='fax_completed_page', method='POST'))
                  my_actions.add(fax_action)
      
              elif 'fax_progress_page' == page:
                  negotiated_settings = query_info.Progress['progress'].get('negotiated_settings')
                  if negotiated_settings:
                      modem = negotiated_settings['modem']
                      datarate = negotiated_settings['data_rate']
                      print("Modem {0} rate {1}".format(modem, datarate))
                  pages = query_info.Progress['progress'].get('pages_sent', '0')
                  print("Page count {0}".format(pages))
                      
              elif 'fax_completed_page' == page:
                  fax_result = query_info.ActionResult['result']['description']
                  print("The fax result is {0}".format(fax_result))
      
              elif 'final_page' == page:
                  if self.final_page(my_actions, query_info) is False:
                      return None
      
              elif 'error_page' == page:
                  if self.error_page(my_actions, query_info) is False:
                      return None
      
              else:
                  if self.unknown_page(my_actions, query_info) is False:
                      return None
                      
              response_body = my_actions.get_json()
              response_headers = [('Content-Type', 'application/json; charset=utf-8'), ('Content-Length', str(len(response_body)))]
              start_response('200 OK', response_headers)
              return [response_body]
      
      
      def test_main():
      
          application = Application()
          # Set the host and port you want to use in the rest_simple_server.py file.
          # To use SSL also set the key and certificate file.
          ss = SimpleServer(application, simple_server_host, simple_server_port, simple_server_keyfile, simple_server_certfile)
          ss.start()
      
      
      if __name__ == "__main__":
          test_thread = MyThread(test_main)
          test_thread.start()
      
          service_name        = raw_input('the outbound service to invoke:')
          service_password    = getpass('your outbound service password:')
          call_to             = raw_input('call to:')
          call_from           = raw_input('call from:')
          token               = raw_input('token:')
          outbound_parameters = raw_input('the outbound service parameters:')
          target              = raw_input('the cloud region or Rapide IP address:')
          username            = raw_input('your cloud or Rapide username:')
      
          outbound_calls = invoke_outbound_service.OutboundCalls(call_to=call_to.strip(),
                                         call_from=call_from.strip(),
                                         token=token.strip(), 
                                         outbound_parameters=outbound_parameters.strip())
          application_instance_ids = invoke_outbound_service.invoke_outbound_service(target=target.strip(), 
                                                             username=username.strip(), 
                                                             service_name=service_name.strip(),
                                                             service_password=service_password.strip(), 
                                                             outbound_calls=outbound_calls)
          test_thread.join()
      
    • declare(encoding='UTF-8');
      spl_autoload_register();
      header("Content-Type: application/json; charset=UTF-8");
      
      $fax = new Aculab\TelephonyRestAPI\SendFax();
      $fax->setTiffFile('myFax.tif');
      $fax->setProgressPage('FaxProgress.php', 'POST');
      $fax->setNextPage('SendFaxComplete.php', 'POST');
      
      $response = new Aculab\TelephonyRestAPI\Actions();
      $response->setToken('my instance id');
      $response->add($fax);
      
      print $response;
      
      
    • declare(encoding='UTF-8');
      spl_autoload_register();
      header("Content-Type: application/json; charset=UTF-8");
      
      $info = Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
      $p = $info->getActionProgress();
      $str = 'send progress: ';
      $str .= ' pages: ' . $p->getPagesSent();
      $str .= ' reconnects: ' . $p->getReconnects();
      $ns = $p->getNegotiatedFaxSettings();
      $str .= ' modem: ' . $ns->getModem() . ' at: ' . $ns->getDataRate() . ' remote: ' . $ns->getRemoteSubscriberId();
      error_log($str);
      
      
      print '';
      
    • declare(encoding='UTF-8');
      spl_autoload_register();
      header("Content-Type: application/json; charset=UTF-8");
      
      $info = Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
      $result = $info->getActionResult();
      $str = 'Fax result: ' . $result->getDescription();
      $str .= ' pages: ' . $result->getPagesSent();
      $str .= ' time: ' . $result->getSecondsDuration();
      error_log($str);
      
      print '';
      
      
    • declare(encoding='UTF-8');
      spl_autoload_register();
      header("Content-Type: application/json; charset=UTF-8");
      
      $info = \Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
      
      $error = $info->getErrorResult();
      $action = $error->getAction();
      $desc = $error->getResult();
      if (!is_null($action)) {
          error_log("Error from action \"$action\" with result:\n$desc\n");
      } else {
          error_log("Error result:\n$desc\n");
      }
      
      $response = new \Aculab\TelephonyRestAPI\Actions();
      $response->setToken('Error');
      
      $play = new \Aculab\TelephonyRestAPI\Play();
      $play->addText('An error has occurred.');
      $response->add($play);
      
      print $response;
      
      
    • declare(encoding='UTF-8');
      spl_autoload_register();
      header("Content-Type: application/json; charset=UTF-8");
      
      $info = \Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
      $call = $info->getThisCallInfo();
      $callid = $call->getCallId();
      $duration = $call->getSecondsCallDuration();
      error_log("This all id: $callid\nThis call duration: $duration\n");
      
      print '';