private void UpdateFromMem(IntPtr sigPtr)
        {
            /* Work around memory layout problem (bug?) on Windows systems
             * with libgpgme <= 1.1.8
             * //_gpgme_signature sig = new _gpgme_signature();
             *
             */
            if (!libgpgme.IsWindows ||
                (Gpgme.Version.Major >= 1 &&
                 Gpgme.Version.Minor >= 2)
                )
            {
                _gpgme_signature unixsig = new _gpgme_signature();
                Marshal.PtrToStructure(sigPtr, unixsig);

                summary         = (SignatureSummary)unixsig.summary;
                fpr             = Gpgme.PtrToStringUTF8(unixsig.fpr);
                status          = unixsig.status;
                timestamp       = unixsig.timestamp;
                exp_timestamp   = unixsig.exp_timestamp;
                validity        = (Validity)unixsig.validity;
                validity_reason = unixsig.validity_reason;
                pubkey_algo     = (KeyAlgorithm)unixsig.pubkey_algo;
                hash_algo       = (HashAlgorithm)unixsig.hash_algo;
                pka_address     = Gpgme.PtrToStringUTF8(unixsig.pka_address);
                wrong_key_usage = unixsig.wrong_key_usage;
                pka_trust       = (PkaStatus)unixsig.pka_trust;
                chain_model     = unixsig.chain_model;

                if (unixsig.notations != IntPtr.Zero)
                {
                    notations = new SignatureNotation(unixsig.notations);
                }

                if (unixsig.next != IntPtr.Zero)
                {
                    next = new Signature(unixsig.next);
                }
            }
            else
            {
                _gpgme_signature_windows winsig = new _gpgme_signature_windows();
                Marshal.PtrToStructure(sigPtr, winsig);

                summary         = (SignatureSummary)winsig.summary;
                fpr             = Gpgme.PtrToStringUTF8(winsig.fpr);
                status          = winsig.status;
                timestamp       = winsig.timestamp;
                exp_timestamp   = winsig.exp_timestamp;
                validity        = (Validity)winsig.validity;
                validity_reason = winsig.validity_reason;
                pubkey_algo     = (KeyAlgorithm)winsig.pubkey_algo;
                hash_algo       = (HashAlgorithm)winsig.hash_algo;
                pka_address     = Gpgme.PtrToStringUTF8(winsig.pka_address);
                wrong_key_usage = winsig.wrong_key_usage;
                pka_trust       = (PkaStatus)winsig.pka_trust;
                chain_model     = winsig.chain_model;

                if (winsig.notations != IntPtr.Zero)
                {
                    notations = new SignatureNotation(winsig.notations);
                }

                if (winsig.next != IntPtr.Zero)
                {
                    next = new Signature(winsig.next);
                }
            }
        }
Exemplo n.º 2
0
        private void UpdateFromMem(IntPtr sigPtr)
        {
            /* Work around memory layout problem (bug?) on Windows systems
             * with libgpgme <= 1.1.8
             * //_gpgme_signature sig = new _gpgme_signature();
             *
             */
            if (!libgpgme.IsWindows ||
                (Gpgme.Version.Major >= 1 &&
                 Gpgme.Version.Minor >= 2)
                )
            {
                var unixsig = new _gpgme_signature();
                Marshal.PtrToStructure(sigPtr, unixsig);

                Summary          = (SignatureSummary)unixsig.summary;
                Fingerprint      = Gpgme.PtrToStringUTF8(unixsig.fpr);
                _status          = unixsig.status;
                _timestamp       = unixsig.timestamp;
                _exp_timestamp   = unixsig.exp_timestamp;
                Validity         = (Validity)unixsig.validity;
                _validity_reason = unixsig.validity_reason;
                PubkeyAlgorithm  = (KeyAlgorithm)unixsig.pubkey_algo;
                HashAlgorithm    = (HashAlgorithm)unixsig.hash_algo;
                PKAAddress       = Gpgme.PtrToStringUTF8(unixsig.pka_address);
                WrongKeyUsage    = unixsig.wrong_key_usage;
                PKATrust         = unixsig.pka_trust;
                ChainModel       = unixsig.chain_model;

                if (unixsig.notations != IntPtr.Zero)
                {
                    Notations = new SignatureNotation(unixsig.notations);
                }

                if (unixsig.next != IntPtr.Zero)
                {
                    Next = new Signature(unixsig.next);
                }
            }
            else
            {
                var winsig = new _gpgme_signature_windows();
                Marshal.PtrToStructure(sigPtr, winsig);

                Summary          = (SignatureSummary)winsig.summary;
                Fingerprint      = Gpgme.PtrToStringUTF8(winsig.fpr);
                _status          = winsig.status;
                _timestamp       = winsig.timestamp;
                _exp_timestamp   = winsig.exp_timestamp;
                Validity         = (Validity)winsig.validity;
                _validity_reason = winsig.validity_reason;
                PubkeyAlgorithm  = (KeyAlgorithm)winsig.pubkey_algo;
                HashAlgorithm    = (HashAlgorithm)winsig.hash_algo;
                PKAAddress       = Gpgme.PtrToStringUTF8(winsig.pka_address);
                WrongKeyUsage    = winsig.wrong_key_usage;
                PKATrust         = winsig.pka_trust;
                ChainModel       = winsig.chain_model;

                if (winsig.notations != IntPtr.Zero)
                {
                    Notations = new SignatureNotation(winsig.notations);
                }

                if (winsig.next != IntPtr.Zero)
                {
                    Next = new Signature(winsig.next);
                }
            }
        }