Exemplo n.º 1
0
        public static void RegisterForUpdate(Update update)
        {
            if (update == null) throw new ArgumentNullException("update");
            if (!IsUpdateSupported()) throw new NotSupportedException();

            UnmanagedStructHandle<UPDATE> updateHandle = UnmanagedStructHandle<UPDATE>.Empty;

            try
            {
                UPDATE updateNative;
                update.MarshalToNative(out updateNative);

                updateHandle = new UnmanagedStructHandle<UPDATE>(ref updateNative);
                int result = MirandaContext.Current.CallService(MS_UPDATE_REGISTER, UIntPtr.Zero, updateHandle.IntPtr);

                if (result != 0)
                    throw new MirandaException(String.Format(TextResources.ExceptionMsg_Formatable2_MirandaServiceReturnedFailure, MS_UPDATE_REGISTER, result.ToString()));
            }
            catch (MirandaException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new MirandaException(TextResources.ExceptionMsg_ErrorWhileCallingMirandaService, e);
            }
            finally
            {
                updateHandle.Free();
            }
        }
Exemplo n.º 2
0
        internal object DatabasePluginInfoThunk(object[] args)
        {
            DatabaseLink link = new DatabaseLink();

            link.Size = Marshal.SizeOf(typeof(DatabaseLink));
            link.GetCapability = GetCapabilityThunk;
            link.GetFriendlyName = GetFriendlyNameThunk;
            link.GrokHeader = GrokHeaderThunk;
            link.Init = InitPreThunk;
            link.MakeDatabase = MakeDatabaseThunk;
            link.Unload = UnloadPreThunk;
            DatabaseLinkHandle = new UnmanagedStructHandle<DatabaseLink>(ref link);

            DatabaseLinkGcHandle = GCHandle.Alloc(link);
            return DatabaseLinkHandle.IntPtr;
        }
Exemplo n.º 3
0
        internal void Register()
        {
            if (Registered)
                throw new InvalidOperationException();

            PROTOCOLDESCRIPTOR descriptor = new PROTOCOLDESCRIPTOR(Name, Type);
            UnmanagedStructHandle<PROTOCOLDESCRIPTOR> nativeHandle = UnmanagedStructHandle<PROTOCOLDESCRIPTOR>.Empty;

            try
            {
                nativeHandle = new UnmanagedStructHandle<PROTOCOLDESCRIPTOR>(ref descriptor);
                int result = Context.CallService(MirandaServices.MS_PROTO_REGISTERMODULE, UIntPtr.Zero, nativeHandle.IntPtr);

                if (result != 0)
                    throw new MirandaException(String.Format(TextResources.ExceptionMsg_Formatable2_MirandaServiceReturnedFailure, result.ToString()));

                this.nativeDescriptor = descriptor;
                Registered = true;
            }
            finally
            {
                nativeHandle.Free();
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Publishes the plugin info and marshals it into a ptr.
        /// </summary>
        private void InitializePluginInfo()
        {
            PLUGININFO pluginInfo = new PLUGININFO();
            PopulatePluginInfo(pluginInfo);
            PluginInfoHandle = new UnmanagedStructHandle<PLUGININFO>(ref pluginInfo);

            PLUGININFOEX pluginInfoEx = new PLUGININFOEX(UUID.HyphenUUID);
            PopulatePluginInfo(pluginInfoEx);
            PluginInfoExHandle = new UnmanagedStructHandle<PLUGININFOEX>(ref pluginInfoEx);

            this.pluginInfo = pluginInfoEx;
        }
Exemplo n.º 5
0
        public IntPtr AddEvent(ContactInfo associatedContact, object data, string owner, DatabaseEventType type, DatabaseEventProperties flags, DateTime? timestamp, bool throwOnFailure)
        {
            if (associatedContact == null)
                throw new ArgumentNullException("associatedContact");

            if (String.IsNullOrEmpty(owner))
                throw new ArgumentNullException("owner");

            if (data == null)
                throw new ArgumentNullException("data");

            IntPtr pBlob = IntPtr.Zero;
            UnmanagedStructHandle<DBEVENTINFO> nativeStruct = UnmanagedStructHandle<DBEVENTINFO>.Empty;

            try
            {
                int totalBytes;

                if (data is string)
                {
                    totalBytes = DBEVENTINFO.LayoutAnsiUniString((string)data, out pBlob);
                }
                else if (data is byte[])
                {
                    byte[] dataBytes = (byte[])data;
                    totalBytes = dataBytes.Length;

                    pBlob = Marshal.AllocHGlobal(totalBytes);
                    Marshal.Copy(dataBytes, 0, pBlob, dataBytes.Length);
                }
                else
                    throw new ArgumentOutOfRangeException("data");

                DBEVENTINFO info = new DBEVENTINFO(0, IntPtr.Zero);
                info.Module = Translate.ToHandle(owner, StringEncoding.Ansi).IntPtr;
                info.BlobSize = (uint)totalBytes;
                info.BlobPtr = pBlob;
                info.EventType = (ushort)type;
                info.Flags = (uint)flags;
                info.Timestamp = Utilities.GetTimestamp(timestamp.HasValue ? timestamp.Value : DateTime.Now);

                nativeStruct = new UnmanagedStructHandle<DBEVENTINFO>(ref info, pBlob, info.Module);
                IntPtr eventHandle = (IntPtr)MirandaContext.Current.CallService(MS_DB_EVENT_ADD, associatedContact.MirandaHandle, nativeStruct.IntPtr);

                if (eventHandle == IntPtr.Zero && throwOnFailure)
                    throw new MirandaException(String.Format(TextResources.ExceptionMsg_Formatable2_MirandaServiceReturnedFailure, MS_DB_EVENT_ADD, eventHandle.ToString()));
                else
                    return eventHandle;
            }
            finally
            {
                nativeStruct.Free();
            }
        }
Exemplo n.º 6
0
        public IntPtr AddEvent(ContactInfo contact, Icon icon, string serviceToCall, IntPtr lParamToPass, IntPtr eventToken, ContactListEventProperties properties, string toolTip)
        {
            if (contact == null)
                throw new ArgumentNullException("contact");

            if (icon == null)
                throw new ArgumentNullException("icon");

            ContactListEvent clistEvent = new ContactListEvent();
            clistEvent.ContactHandle = contact.MirandaHandle;
            clistEvent.EventHandle = eventToken;
            clistEvent.Flags = (uint)properties;
            clistEvent.IconHandle = icon.Handle;
            clistEvent.LParam = lParamToPass;
            clistEvent.ServiceName = serviceToCall;
            clistEvent.Tooltip = toolTip;

            UnmanagedStructHandle<ContactListEvent> nativeStruct = UnmanagedStructHandle<ContactListEvent>.Empty;

            try
            {
                nativeStruct = new UnmanagedStructHandle<ContactListEvent>(ref clistEvent);
                IntPtr eventHandle = (IntPtr)MirandaContext.Current.CallService(MS_CLIST_ADDEVENT, UIntPtr.Zero, nativeStruct.IntPtr);

                if (eventHandle != IntPtr.Zero)
                    throw new MirandaException(String.Format(TextResources.ExceptionMsg_Formatable2_MirandaServiceReturnedFailure, MS_CLIST_ADDEVENT, eventHandle.ToString()));

                return clistEvent.EventHandle;
            }
            finally
            {
                nativeStruct.Free();
            }
        }
Exemplo n.º 7
0
        public bool ShowBaloonTip(string title, string text, string protocol, ToolTipIcon icon, int timeout)
        {
            UnmanagedStructHandle<MIRANDASYSTRAYNOTIFY> nativeHandle = UnmanagedStructHandle<MIRANDASYSTRAYNOTIFY>.Empty;

            try
            {
                MIRANDASYSTRAYNOTIFY msn = new MIRANDASYSTRAYNOTIFY(title, text, icon);
                msn.Timeout = (uint)timeout;
                msn.Protocol = protocol;

                nativeHandle = new UnmanagedStructHandle<MIRANDASYSTRAYNOTIFY>(ref msn);
                int result = MirandaContext.Current.CallService(MirandaServices.MS_CLIST_SYSTRAY_NOTIFY, UIntPtr.Zero, nativeHandle.IntPtr);

                bool retValue = (result == 0);
                Debug.Assert(retValue);

                return retValue;
            }
            finally
            {
                nativeHandle.Free();
            }
        }
Exemplo n.º 8
0
        public bool ModifyMenuItem(MirandaPlugin owner, MenuItemDeclarationAttribute menuItem, string text, MenuItemProperties flags, Icon icon, HotKeys hotKey, bool updateItemDescriptor)
        {
            if (owner == null)
                throw new ArgumentNullException("owner");

            if (menuItem == null)
                throw new ArgumentNullException("menuItem");

            if (menuItem.MirandaHandle == IntPtr.Zero)
                throw new ArgumentException("Invalid menu item handle.");

            UnmanagedStructHandle<CLISTMENUITEM> nativeHandle = UnmanagedStructHandle<CLISTMENUITEM>.Empty;

            try
            {
                SynchronizationHelper.BeginMenuItemUpdate(menuItem);

                CLISTMENUITEM nativeItem = new CLISTMENUITEM(owner, menuItem);
                MenuItemModifyFlags modifyFlags = MenuItemModifyFlags.None;

                if (text != null)
                {
                    modifyFlags |= MenuItemModifyFlags.CMIM_NAME;
                    nativeItem.Text = text;

                    if (updateItemDescriptor) menuItem.Text = text;
                }
                if (flags != MenuItemProperties.KeepCurrent)
                {
                    modifyFlags |= MenuItemModifyFlags.CMIM_FLAGS;
                    nativeItem.Flags = (uint)flags;

                    if (updateItemDescriptor) menuItem.Flags = flags;
                }
                if (icon != null)
                {
                    modifyFlags |= MenuItemModifyFlags.CMIM_ICON;
                    nativeItem.Icon = icon.Handle;
                }
                if (hotKey != 0)
                {
                    modifyFlags |= MenuItemModifyFlags.CMIM_HOTKEY;
                    nativeItem.HotKey = (uint)hotKey;
                    if (updateItemDescriptor) menuItem.HotKey = hotKey;
                }

                nativeItem.Flags |= (uint)modifyFlags;

                nativeHandle = new UnmanagedStructHandle<CLISTMENUITEM>(ref nativeItem);
                bool result = MirandaContext.Current.CallService(MirandaServices.MS_CLIST_MODIFYMENUITEM, (UIntPtr)(uint)menuItem.MirandaHandle, nativeHandle.IntPtr) == 0
                    ? true : false;

                Debug.Assert(result);
                return result;
            }
            catch (Exception e)
            {
                throw new MirandaException(TextResources.ExceptionMsg_ErrorWhileCallingMirandaService + e.Message, e);
            }
            finally
            {
                nativeHandle.Free();
                SynchronizationHelper.EndUpdate(menuItem);
            }
        }
Exemplo n.º 9
0
        public void AddMenuItem(MirandaPlugin owner, MenuItemDeclarationAttribute item)
        {
            if (owner == null)
                throw new ArgumentNullException("owner");

            if (item == null)
                throw new ArgumentNullException("item");

            string serviceName = item.IsContactMenuItem ? MirandaServices.MS_CLIST_ADDCONTACTMENUITEM : MirandaServices.MS_CLIST_ADDMAINMENUITEM;

            UnmanagedStructHandle<CLISTMENUITEM> nativeHandle = UnmanagedStructHandle<CLISTMENUITEM>.Empty;
            CLISTMENUITEM nativeItem = new CLISTMENUITEM(owner, item);

            try
            {
                nativeHandle = new UnmanagedStructHandle<CLISTMENUITEM>(ref nativeItem);

                IntPtr handle = (IntPtr)MirandaContext.Current.CallService(serviceName, UIntPtr.Zero, nativeHandle.IntPtr,
                    (owner is StandalonePlugin && !item.IsAdditional));

                item.MirandaHandle = handle;
                Debug.Assert(handle != IntPtr.Zero);
            }
            finally
            {
                nativeHandle.Free();
            }
        }
Exemplo n.º 10
0
        public void FreeTest()
        {
            this.TestHandle.Free();
            Assert.AreEqual<IntPtr>(IntPtr.Zero, this.TestHandle.IntPtr, "Free method did not zeroed the memory handle.");

            this.TestHandle = UnmanagedStructHandle<int>.Empty;
            this.TestHandle.Free();

            IntPtr ptr = Marshal.AllocHGlobal(1);
            Marshal.StructureToPtr(0xac, ptr, false);

            this.TestHandle = new UnmanagedStructHandle<int>(ref this.TestData, ptr);
            this.TestHandle.Free();
            Assert.AreNotEqual<byte>(0xac, Marshal.ReadByte(ptr), "Free did not released the single-pressure.");

            ptr = Marshal.AllocHGlobal(1);
            Marshal.StructureToPtr(0xac, ptr, false);

            this.TestHandle = new UnmanagedStructHandle<int>(ref this.TestData, new IntPtr[] { ptr });
            this.TestHandle.Free();
            Assert.AreNotEqual<byte>(0xac, Marshal.ReadByte(ptr), "Free did not released the pressure.");
        }
Exemplo n.º 11
0
 public void TestInitialize()
 {
     this.TestData = TestDataValue;
     this.TestHandle = new UnmanagedStructHandle<int>(ref this.TestData);
 }
Exemplo n.º 12
0
        public void CtorTest()
        {
            int i = 100;
            this.TestHandle = new UnmanagedStructHandle<int>(ref i, MarshalKind.Copy);

            Marshal.WriteInt32(this.TestHandle, -100);
            this.TestHandle.MarshalBack(out i);

            Assert.AreEqual<int>(-100, i, "Copy method does not work properly.");
            this.TestHandle.Free();

            i = 100;
            this.TestHandle = new UnmanagedStructHandle<int>(ref i, MarshalKind.PinBlittable);

            Marshal.WriteInt32(this.TestHandle, -100);
            this.TestHandle.MarshalBack(out i);

            Assert.AreEqual<int>(-100, i, "PinBlittable method does not work properly.");
            this.TestHandle.Free();
        }
Exemplo n.º 13
0
        private void GetMMInterface()
        {
            mirandaMemoryManager = new MM_INTERFACE();
            mirandaMemoryManager.Size = Marshal.SizeOf(typeof(MM_INTERFACE));

            UnmanagedStructHandle<MM_INTERFACE> mmiHandle = new UnmanagedStructHandle<MM_INTERFACE>(ref mirandaMemoryManager);

            try
            {
                if (CallService(MS_SYSTEM_GET_MMI, IntPtr.Zero, mmiHandle.IntPtr) == CallbackResult.Success)
                    mmiHandle.MarshalBack(out mirandaMemoryManager);
                else
                    throw new MirandaException(String.Format(TextResources.ExceptionMsg_Formatable2_MirandaServiceReturnedFailure, MS_SYSTEM_GET_MMI, "1"));
            }
            finally
            {
                mmiHandle.Free();
            }
        }