コード例 #1
0
        protected virtual void btnOk_Click(object sender, EventArgs e)
        {
            IMORZEContact cnt = null;

            try
            {
                if (string.IsNullOrEmpty(tbName.Text) == false)
                {
                    if (m_cnt == null)
                    {
                        cnt          = new MORZEContact(tbName.Text, tbAddress.Text);
                        m_cnt        = cnt;
                        DialogResult = DialogResult.OK;
                        Close();
                    }
                }
                else
                {
                    MessageBox.Show("Name is empty", Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
コード例 #2
0
        public string SendMessage(MORZEMessage msg, IMORZEContact to)
        {
            string err = null;

            if (to.isHasConfirmEtx() == true)
            {
                try
                {
                    ExtKey           ext;
                    byte []          netmsg = to.getMORZENetMessage(msg, out ext);
                    MORZESendMessage m      = new MORZESendMessage();
                    m.AddMessageBody(netmsg, ext.HashID, ext.Ext);
                    m.Send(m_netStream);
                    msg.Status = MORZEMessageStatus.sended;
                    msg.AddHashInfo(ext.HashID, SMSCrypt.CalcHash(ext.HashID, netmsg));
                }
                catch (Exception exp)
                {
                    OnConnectChange(false, exp.Message);
                }
            }
            else
            {
                SendInitialMessage(to);
            }
            return(err);
        }
コード例 #3
0
 private void OnRecvMessage(IMORZEContact sender, MORZEMessage msg)
 {
     Invoke(new Action(() =>
     {
         PutDisplayMessage(sender.ToString(), msg.ToString(), false);
     }));
 }
コード例 #4
0
 private void tmCheckNotify_Tick(object sender, EventArgs e)
 {
     if (m_account != null)
     {
         List <MORZEMessages> msgs = null;
         msgs = m_account.GetSendedAndUncofirmedMessages(new TimeSpan(0, 0, 0, 0, tmCheckNotify.Interval));
         if (msgs != null)
         {
             foreach (MORZEMessages mm in msgs)
             {
                 if (mm.Messages.Any())
                 {
                     mm.Messages.OrderBy(x => x.Date);
                     IMORZEContact cnt = m_book.GetContact(mm.ContactAddress, false);
                     if (cnt != null)
                     {
                         MORZEContact mc = cnt as MORZEContact;
                         mc.clearAllExt();
                         m_net.SendMessage(mm.Messages.FirstOrDefault(), cnt);
                     }
                     else
                     {
                         mm.Messages[0].Status = MORZEMessageStatus.recipUnknown;
                     }
                 }
             }
         }
     }
 }
コード例 #5
0
        public SMSInitialMessage(IMORZEAccount account, IMORZEContact contact)
        {
            BufferBuilder bb = new BufferBuilder();

            m_account = account;
            bb.AddByte(1);//- init message
            m_newExt = contact.getInitalData();
            bb.AddByte((byte)m_newExt.HashID);
            bb.AddBytes(m_newExt.Ext);

            bb.AddByte((byte)m_newExt.SyncID);
            bb.AddBytes(m_newExt.SyncKey);
            bb.AddBytes(m_newExt.SyncIV);
            bb.AddUshort(0);//или CRC16
            byte [] data = bb.GetAllBytes();
            data = contact.EncryptPK(data);
            byte[] addressdata = m_newExt.SyncEncrypt(account.GetMyAccount());
            bb = new BufferBuilder();

            bb.AddByte(contact.XOR((byte)data.Length, 0x10));
            bb.AddBytes(data);

            bb.AddBytes(addressdata);
            AddMessageBody(bb.GetAllBytes(), m_newExt.HashID, null);
        }
コード例 #6
0
 public dlgMessage(IMORZEContact cnt, IMORZEAccount acc, SMSNet net)
 {
     m_cnt = cnt;
     m_acc = acc;
     m_net = net;
     m_lastLoadedMessage = null;
     InitializeComponent();
 }
コード例 #7
0
        public dlgContact()
        {
            m_cnt = null;

            InitializeComponent();

            Text = "New contact";
            btnRefresh.Enabled = false;
        }
コード例 #8
0
 private void book_OnNewAccountRecive(IMORZEContact contact)
 {
     if (contact != null)
     {
         Invoke(new Action(() =>
         {
             AddContactToList(contact);
         }));
     }
 }
コード例 #9
0
        public bool AddReciveredMessage(IMORZEContact from, MORZEMessage msg)
        {
            bool          bres = false;
            MORZEMessages msgs = GetMessages(from);

            if (msgs != null)
            {
                msgs.AddRecivedMessages(msg);
            }
            return(bres);
        }
コード例 #10
0
        public bool SetDeliveredMessage(IMORZEContact from, SMSHash hashid, byte [] hash)
        {
            bool          bres = false;
            MORZEMessages msgs = GetMessages(from);

            if (msgs != null)
            {
                msgs.SetDeliveredMessage(hashid, hash);
            }
            return(bres);
        }
コード例 #11
0
        public string UpdateContact(IMORZEContact cnt)
        {
            string       err = null;
            MORZEContact c   = m_contacts.Where(x => x.GetAddress() == cnt.GetAddress()).FirstOrDefault();

            if (c != null)
            {
                c.DisplayName = cnt.ToString();
            }

            return(err);
        }
コード例 #12
0
        private void AddContactToList(IMORZEContact contact)
        {
            ListViewItem lvi = new ListViewItem(contact.ToString());

            lvi.Tag         = contact;
            lvi.ToolTipText = contact.GetAddress();
            lvContact.Items.Add(lvi);

            MORZEContact mrz = contact as MORZEContact;

            mrz.OnRecvNotifyAcceptecExtKey += OnRecvNotifyAcceptecExtKey;
            mrz.OnRecvMessage            += OnRecvMessage;
            mrz.OnRecvDeliveredMsgNotify += OnRecvDeliveredMsgNotify;
        }
コード例 #13
0
        private void OnRecvMessage(IMORZEContact sender, MORZEMessage msg)
        {
            Invoke(new Action(() =>
            {
                for (int i = 0; i < lvContact.Items.Count; i++)
                {
                    IMORZEContact c = lvContact.Items[i].Tag as IMORZEContact;;
                    if (c != null && c.GetAddress() == sender.GetAddress())
                    {
                        lvContact.Items[i].Font = new Font(lvContact.Items[i].Font, FontStyle.Bold);
                    }
                }

                m_account.AddReciveredMessage(sender, msg);
            }));
        }
コード例 #14
0
        private void SendInitialMessage(IMORZEContact to)
        {
            SMSInitialMessage imsg = new SMSInitialMessage(m_account, to);

            //Monitor.Enter(this);
            ////if (m_InitalMessages == null)
            ////    m_InitalMessages = new List<MORZEInitialMessage>();
            ////m_InitalMessages.Add(imsg);
            //Monitor.Exit(this);

            imsg.Send(m_netStream);
            SMSSendExt ext = new SMSSendExt(this);

            imsg.InitExtParam(ext);
            ext.Send(m_netStream);
        }
コード例 #15
0
        private void lvContact_DoubleClick(object sender, EventArgs e)
        {
            if (lvContact.SelectedItems.Count == 1)
            {
                if (lvContact.SelectedItems[0].Font.Bold == true)
                {
                    lvContact.Items[0].Font = new Font(lvContact.Items[0].Font, FontStyle.Regular);
                }

                IMORZEContact cnt = lvContact.SelectedItems[0].Tag as IMORZEContact;


                dlgMessage msg = null;
                if (m_dlgMsgs != null)
                {
                    for (int i = 0; i < m_dlgMsgs.Count && msg == null; i++)
                    {
                        if (m_dlgMsgs[i].Tag == cnt)
                        {
                            msg = m_dlgMsgs[i];
                        }
                    }
                }
                else
                {
                    m_dlgMsgs = new List <dlgMessage>();
                }

                if (msg == null)
                {
                    msg             = new dlgMessage(cnt, m_account, m_net);
                    msg.Tag         = cnt;
                    msg.FormClosed += Msg_FormClosed;
                    m_dlgMsgs.Add(msg);
                }
                if (msg != null)
                {
                    if (msg.Visible == false)
                    {
                        msg.Show();
                    }
                    msg.Focus();
                }
            }
        }
コード例 #16
0
        private void OnRecvNotifyAcceptecExtKey(IMORZEContact sender)
        {
            List <MORZEMessage> msgs;

            msgs = m_account.GetUnsendedNewMessages(sender, new TimeSpan(0, 0, 0, 0, tmCheckNotify.Interval));
            if (msgs != null)
            {
                string err;
                foreach (MORZEMessage msg in msgs)
                {
                    err = m_net.SendMessage(msg, sender);
                    if (string.IsNullOrEmpty(err) == true)
                    {
                        msg.Status = MORZEMessageStatus.sended;
                    }
                }
            }
        }
コード例 #17
0
        /// <summary>
        /// message send
        /// </summary>
        /// <param name="msg">mesage's plain text</param>
        /// <param name="to">reciver</param>
        /// <returns>error description</returns>
        public string SendMessage(string msg, IMORZEContact to)
        {
            string err = null;

            if (to.isHasConfirmEtx() == false)
            {
                try
                {
                    SendInitialMessage(to);

                    MORZEMessages msgs;
                    msgs = m_account.GetMessages(to);
                    if (msgs != null)
                    {
                        msgs.AddUnsendedNewMessages(msg);
                    }
                }
                catch (Exception exp)
                {
                    OnConnectChange(false, exp.Message);
                }
            }
            else
            {
                ExtKey       ext;
                MORZEMessage mmsg   = new MORZEMessage(msg.ToString());
                byte[]       netmsg = to.getMORZENetMessage(mmsg, out ext);

                MORZESendMessage m = new MORZESendMessage();
                m.AddMessageBody(netmsg, ext.HashID, ext.Ext);

                m.Send(m_netStream);

                MORZEMessages msgs;
                msgs = m_account.GetMessages(to);
                if (msgs != null)
                {
                    mmsg.AddHashInfo(ext.HashID, SMSCrypt.CalcHash(ext.HashID, netmsg));
                    msgs.AddSendedNewMessages(mmsg);
                }
            }
            return(err);
        }
コード例 #18
0
        public List <MORZEMessage> GetUnsendedNewMessages(IMORZEContact contact, TimeSpan interval)
        {
            List <MORZEMessage> lmsg = null;

            Monitor.Enter(this);

            MORZEMessages msgs = null;

            if (m_Messages != null)
            {
                msgs = m_Messages.Where(x => x.ContactAddress == contact.GetAddress()).FirstOrDefault();
                if (msgs != null)
                {
                    lmsg = msgs.Messages.Where(x => x.Status == MORZEMessageStatus.unsendedNew || (x.Status == MORZEMessageStatus.sended && x.Date + interval < DateTime.Now)).ToList();
                }
            }
            Monitor.Exit(this);

            return(lmsg);
        }
コード例 #19
0
        public string AddContact(IMORZEContact cnt)
        {
            string err = null;

            if (m_contacts == null)
            {
                m_contacts = new List <MORZEContact>();
            }
            Monitor.Enter(m_contacts);
            try
            {
                m_contacts.Add(cnt as MORZEContact);
            }
            catch (Exception exp)
            {
                err = exp.Message;
            }
            Monitor.Exit(m_contacts);
            return(err);
        }
コード例 #20
0
        private void newContact_Click(object sender, EventArgs e)
        {
            dlgContact dlg = new dlgContact();

            if (dlg.ShowDialog() == DialogResult.OK)
            {
                IMORZEContact contact = dlg.MORZEContact;
                string        err     = m_book.AddContact(contact);
                if (string.IsNullOrEmpty(err) == true)
                {
                    m_book.Save();
                    AddContactToList(contact);
                }
                else
                {
                    MessageBox.Show(err, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            dlg.Dispose();
        }
コード例 #21
0
        /// <summary>
        /// добавить контакт в адресную книгу
        /// </summary>
        /// <param name="address">адрес контакта</param>
        /// <param name="isaddIfnotExist">добавить контакт если не сущесвует</param>
        /// <returns></returns>
        public IMORZEContact GetContact(string address, bool addIfnotExist)
        {
            IMORZEContact cnt   = null;
            bool          isnew = false;

            Monitor.Enter(m_contacts);

            var cnts = m_contacts.Where(x => x.GetAddress() == address);

            if (cnts.Any() == true)
            {
                cnt = cnts.First();
            }
            else
            {
                if (addIfnotExist == true)
                {
                    try
                    {
                        MORZEContact _cnt;
                        _cnt = new MORZEContact(null, address);
                        m_contacts.Add(_cnt);
                        cnt   = _cnt;
                        isnew = true;
                    }
                    catch (Exception exp)
                    {
                        cnt = null;
                    }
                }
            }

            Monitor.Exit(m_contacts);
            if (cnt != null && OnNewAccountRecive != null && isnew == true)
            {
                OnNewAccountRecive(cnt);
            }
            return(cnt);
        }
コード例 #22
0
        public IMORZEContact GetContact(byte [] ext)
        {
            IMORZEContact cnt = null;

            Monitor.Enter(m_contacts);
            foreach (MORZEContact c in m_contacts)
            {
                if (c.isHasExt(ext) == true)
                {
                    if (cnt == null)
                    {
                        cnt = c;
                    }
                    else
                    {
                        throw new Exception("multiple ext");
                    }
                }
            }
            Monitor.Exit(m_contacts);
            return(cnt);
        }
コード例 #23
0
        public MORZEMessages GetMessages(IMORZEContact contact)
        {
            Monitor.Enter(this);

            MORZEMessages msgs = null;

            if (m_Messages == null)
            {
                m_Messages = new List <MORZEMessages>();
            }
            else
            {
                msgs = m_Messages.Where(x => x.ContactAddress == contact.GetAddress()).FirstOrDefault();
            }
            if (msgs == null)
            {
                msgs = new MORZEMessages(contact);
                m_Messages.Add(msgs);
            }
            Monitor.Exit(this);

            return(msgs);
        }
コード例 #24
0
 private void properyToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (lvContact.SelectedItems.Count == 1)
     {
         dlgContact dlg = new dlgContact();
         dlg.MORZEContact = lvContact.SelectedItems[0].Tag as IMORZEContact;
         if (dlg.ShowDialog() == DialogResult.OK)
         {
             IMORZEContact contact = dlg.MORZEContact;
             string        err     = m_book.UpdateContact(contact);
             if (string.IsNullOrEmpty(err) == true)
             {
                 m_book.Save();
                 lvContact.SelectedItems[0].Text = contact.ToString();
             }
             else
             {
                 MessageBox.Show(err, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
         }
         dlg.Dispose();
     }
 }
コード例 #25
0
        public MORZERecvMessages(IMORZEAccount acc, byte[] data) : base(data)
        {
            int off = 0;

            byte[] msg;

            byte[] hash;
            byte[] ext;

            m_responses = null;
            byte[] addascii = Encoding.ASCII.GetBytes(acc.GetMyAccount());

            m_acc = acc;
            bool    err     = false;
            SMSHash mrzhash = SMSHash.None;

            while (off < data.Length && err == false)
            {
                msg  = null;
                hash = null;
                ext  = null;

                off++;             //ttl
                ushort msglen = 0;
                switch (data[off]) //hash
                {
                case 0x01:         //md5
                    hash    = new byte[0x10];
                    mrzhash = SMSHash.MD5;
                    break;

                case 0x81:
                    hash    = new byte[0x10];
                    mrzhash = SMSHash.MD5;
                    ext     = new byte[0x10];
                    break;

                default:
                    err = true;
                    break;
                }
                if (err == false)
                {
                    off++;
                    Array.Copy(data, off, hash, 0, hash.Length);
                    off += hash.Length;
                    if (ext != null)
                    {
                        Array.Copy(data, off, ext, 0, ext.Length);
                        off += ext.Length;
                    }
                    msglen = BitConverter.ToUInt16(data, off);
                    off   += 2;
                    if (msglen + off <= data.Length)
                    {
                        msg = new byte[msglen];
                        Array.Copy(data, off, msg, 0, msg.Length);
                        off += msg.Length;
                    }
                    else
                    {
                        err = true;
                    }
                }
                if (err == false)
                {
                    bool add = false;
                    if (checkHash(mrzhash, hash, msg) == true)
                    {
                        if (ext == null)
                        {//данные зашифрованные открытым ключем
                            byte   asynclen = 0;
                            byte[] smsg     = null;
                            byte[] async    = null;
                            asynclen = (byte)((int)addascii[0x10] ^ (int)msg[0]);
                            if (asynclen > 0)
                            {
                                async = new byte[asynclen];
                                Array.Copy(msg, 1, async, 0, async.Length);
                                if ((int)asynclen < msg.Length)
                                {
                                    smsg = new byte[msg.Length - (1 + asynclen)];
                                    Array.Copy(msg, 1 + asynclen, smsg, 0, smsg.Length);
                                }
                                else
                                {
                                    if (msg.Length < asynclen)
                                    {
                                        err = true;
                                    }
                                }
                                if (err == false)
                                {
                                    byte[] dec;
                                    byte[] tail       = null;
                                    int    taillength = msg.Length - asynclen - 1;
                                    if (taillength < 0)
                                    {
                                        err = true;
                                    }
                                    else
                                    {
                                        tail = new byte[taillength];
                                        Array.Copy(msg, async.Length + 1, tail, 0, taillength);
                                        if (acc.decodeAsync(async, out dec) == true)
                                        {
                                            err = !operateAsync(dec, tail);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                err = true;
                            }
                        }
                        else
                        {
                            add = true;
                        }

                        if (add == true)
                        {
                            if (m_msgData == null)
                            {
                                m_msgData = new List <byte[]>();
                            }
                            if (m_msgHash == null)
                            {
                                m_msgHash = new List <byte[]>();
                            }
                            if (m_msgExt == null)
                            {
                                m_msgExt = new List <byte[]>();
                            }
                            m_msgData.Add(msg);
                            m_msgHash.Add(hash);
                            m_msgExt.Add(ext);

                            IMORZEContact mc = m_acc.GetAddressBook().GetContact(ext);

                            if (mc != null)
                            {
                                if (mc.PutReciveMessage(msg, hash, mrzhash, ext) == true)
                                {
                                    MORZEContact cc = mc as MORZEContact;
                                    if (cc != null)
                                    {
                                        List <byte[]> r = cc.Responses;
                                        if (r != null)
                                        {
                                            foreach (byte[] i in r)
                                            {
                                                MORZESendMessage cmdMsgTyp2 = new MORZESendMessage();
                                                cmdMsgTyp2.AddMessageBody(i, mrzhash, ext);
                                                if (m_responses == null)
                                                {
                                                    m_responses = new List <SMSSendCommand>();
                                                }
                                                m_responses.Add(cmdMsgTyp2);
                                            }
                                            cc.Responses.Clear();
                                        }
                                    }
                                }
                            }
                        }
                    } //if (checkHash(mrzhash, hash, msg) == true)
                }
            }         //while (off<data.Length && err==false)
            if (err == true || off != data.Length)
            {
                m_msgData = null;
                m_msgHash = null;
                m_msgExt  = null;
            }
        }
コード例 #26
0
 private void OnRecvDeliveredMsgNotify(IMORZEContact sender, SMSHash hashid, byte[] hash)
 {
     m_account.SetDeliveredMessage(sender, hashid, hash);
 }
コード例 #27
0
 public MORZEMessages(IMORZEContact contact)
 {
     //m_account = account;
     //m_contact = contact;
     m_contactAddress = contact.GetAddress();
 }