public static VoipMsResponse SendSMS(SMS sms) { Tuple<CookieContainer, VoipMsResponse> login = Login (); VoipMsResponse res; // Login error if (login.Item2.page != "sms.html") { // Error response from login res = login.Item2; } // We are logued in, now try to send the message ! else { var request = (HttpWebRequest)WebRequest.Create("https://sms.voip.ms/sms_manage.php"); request.CookieContainer = login.Item1; var postData = "contact=" + sms.Target.ToDigitsOnly(); //var postData = "contact=" + "4182221617"; postData += "&did=5143123182"; postData += "&msg=" + sms.Message; postData += "&method=send_sms"; postData += "&type="; postData += "&type=0"; postData += "&sync=1"; var data = Encoding.ASCII.GetBytes(postData); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); Console.WriteLine("-------------- SMS RESPONSE STRING --------------" + "\n" + responseString); // Convert JSON response to VoipMsResponse res = (VoipMsResponse) JsonConvert.DeserializeObject(responseString, typeof(VoipMsResponse)); } return res; }
public void AddMessage(SMS sms) { const string Tag = "conversation"; sms.Time = DateTime.Now.ToString ("yyyyMMddHHmmssffff"); // Create message's document var docMessage = database.CreateDocument(); var props = new Dictionary<string, object> { { "conversationId", sms.Target }, { "type", typeof(SMS).Name.ToLower() }, { "time", sms.Time }, { "text", sms.Message }, { "source", sms.Source } }; docMessage.PutProperties(props); // Update conversation // TODO : check if message update is OK var docConversation = database.GetDocument(sms.Target); docConversation.Update((UnsavedRevision newRevision) => { var properties = newRevision.Properties; properties["conversationId"] = sms.Target; properties["type"] = Tag; properties["lastMessage"] = sms.Message; properties["lastMessageTime"] = DateTime.Now.ToString("yyyyMMddHHmmssffff"); properties["source"] = sms.Source; return true; }); }
// Create document for conversation if not exists void initConversation(SMS sms) { // Try to get document var doc = Database.GetExistingDocument (sms.Target); // Document does not exists, let's create a new one if (doc == null) { var properties = new Dictionary<string, object> { { "conversationId", sms.Target }, { "type", Tag.ToString() }, { "lastMessage", null }, { "lastMessageTime", null }, }; var document = Database.GetDocument(sms.Target); var rev = document.PutProperties(properties); } }
protected override void OnCreate(Bundle bundle) { base.OnCreate (bundle); RequestWindowFeature(WindowFeatures.IndeterminateProgress); // Load contact infos string normalizedPhone = Intent.GetStringExtra("normalizedPhone"); string message = Intent.GetStringExtra("message"); Contact contact = Contact.GetContactByPhone(normalizedPhone, this); // Get database instance Database = Manager.SharedInstance.GetDatabase(Tag.ToLower()); var smsManager = new SMSManager (Database); var sms = new SMS(normalizedPhone, message); // Create conversation document if not exist initConversation (sms); // If message comes from notification, add it to db string source = (string) Intent.GetStringExtra ("source"); if (source == "server") { sms.Source = source; smsManager.AddMessage (sms); } // Get previous messages // TODO : Filer messages to get only those from current conversation Query = smsManager.GetQuery(sms.Target); Query.Completed += (sender, e) => Log.Verbose(Tag, e.ErrorInfo.ToString() ?? e.Rows.ToString()); LiveQuery = Query.ToLiveQuery(); SetContentView (Resource.Layout.Conversation); // Activate Back button in Action Bar ActionBar.SetHomeButtonEnabled(true); ActionBar.SetDisplayHomeAsUpEnabled(true); // Rethrive layout fields TextView newMessageText = FindViewById<TextView> (Resource.Id.txtMessageBox); FloatingActionButton sendMessageButton = FindViewById<FloatingActionButton> (Resource.Id.btnSendMessage); LinearLayout layout = FindViewById<LinearLayout> (Resource.Id.mainLinearLayout); ListView listView = FindViewById<ListView>(Resource.Id.listViewMessages); // Set ActionBar to contact name this.Title = contact.DisplayName + " " + contact.NormalizedNumber; sendMessageButton.Click += (sender, e) => { sms.Message = newMessageText.Text; sms.Source = "app"; Background(sms); newMessageText.Text = ""; }; Database.Changed += (sender, e) => { var changes = e.Changes.ToList(); foreach (DocumentChange change in changes) { Log.Verbose(Tag, "Document " + change.DocumentId + " changed"); } }; // Bind listview adapyer to liveQuery listView.Adapter = new ListLiveQueryAdapter(this, LiveQuery); }
void Background(SMS sms) { // Starting a new thread to do the workload of sending the sms new Thread(new ThreadStart(() => { // Send sms VoipMsResponse response = SMSManager.SendSMS(sms); // An error ocured while sending sms... Show error message /*if (response.error != null) { RunOnUiThread ( () => { //response.error txtMessageStatus.Text; }); }*/ // Save message to database, add it to the listview RunOnUiThread ( () => { var smsManager = new SMSManager (Database); smsManager.AddMessage(sms); }); } )).Start(); }