// Implements the SendSMS Workflow Activity.
namespace LucasDemoPlugins.TropoWorkflows
{
using System;
using System.Activities;
using System.ServiceModel;
using System.Globalization;
using System.Runtime.Serialization;
using System.IO;
using System.Text;
using System.Net;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
public sealed class SendCall : CodeActivity
{
[Input("Recipient phone number")]
public InArgument RecipientIn { get; set; }
[Input("Message")]
public InArgument MessageIn { get; set; }
private string _webAddress = "https://api.tropo.com/v1/sessions";
private string _tropoToken = "YOUR_TOKEN_HERE"; //voice or messaging token as appropriate
///
/// Executes the workflow activity.
///
/// The execution context.
protected override void Execute(CodeActivityContext executionContext)
{
// Create the tracing service
ITracingService tracingService = executionContext.GetExtension();
if (tracingService == null)
{
throw new InvalidPluginExecutionException("Failed to retrieve tracing service.");
}
tracingService.Trace("Entered SendCall.Execute(), Activity Instance Id: {0}, Workflow Instance Id: {1}",
executionContext.ActivityInstanceId,
executionContext.WorkflowInstanceId);
// Create the context
IWorkflowContext context = executionContext.GetExtension();
if (context == null)
{
throw new InvalidPluginExecutionException("Failed to retrieve workflow context.");
}
tracingService.Trace("SendCall.Execute(), Correlation Id: {0}, Initiating User: {1}",
context.CorrelationId,
context.InitiatingUserId);
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
try
{
//create a new troporequest object
TropoRequest tropoReq = new TropoRequest
{
To = RecipientIn.Get(executionContext),
Message = MessageIn.Get(executionContext),
Token = _tropoToken
};
//serialize the troporequest to json
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(tropoReq.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, tropoReq);
string jsonMsg = Encoding.Default.GetString(ms.ToArray());
//create the json webrequest and execute it
System.Net.WebRequest req = System.Net.WebRequest.Create(_webAddress);
req.ContentType = "application/json";
req.Method = "POST";
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(jsonMsg.ToString());
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
//get the response
System.Net.WebResponse resp = req.GetResponse();
//deserialize the response to a troporesponse object
TropoResponse tropoResponse = new TropoResponse();
System.Runtime.Serialization.Json.DataContractJsonSerializer deserializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(tropoResponse.GetType());
tropoResponse = deserializer.ReadObject(resp.GetResponseStream()) as TropoResponse;
//if the success value is false, throw an error - not strictly necessary as tropo returns an HTTP error code, but still good to have just in case
if (!tropoResponse.Success)
{
throw new Exception("SendCall failure: " + tropoResponse.Reason);
}
}
catch (WebException exception)
{
string str = string.Empty;
if (exception.Response != null)
{
using (StreamReader reader =
new StreamReader(exception.Response.GetResponseStream()))
{
str = reader.ReadToEnd();
}
exception.Response.Close();
}
if (exception.Status == WebExceptionStatus.Timeout)
{
throw new InvalidPluginExecutionException(
"The timeout elapsed while attempting to issue the request.", exception);
}
throw new InvalidPluginExecutionException(String.Format(CultureInfo.InvariantCulture,
"A Web exception ocurred while attempting to issue the request. {0}: {1}",
exception.Message, str), exception);
}
catch (FaultException e)
{
tracingService.Trace("Exception: {0}", e.ToString());
// Handle the exception.
throw;
}
catch (Exception e)
{
tracingService.Trace("Exception: {0}", e.ToString());
throw;
}
tracingService.Trace("Exiting SendCall.Execute(), Correlation Id: {0}", context.CorrelationId);
}
}
}