private DSSXSDNamespace.DocumentWithSignature FindDocumentWithSignature(SignResponse signResponse)
        {
            if (null == signResponse.OptionalOutputs)
            {
                return(null);
            }
            foreach (XmlElement optionalOutput in signResponse.OptionalOutputs.Any)
            {
                if (optionalOutput.NamespaceURI.Equals(DSSConstants.DSS_NAMESPACE) &&
                    optionalOutput.LocalName.Equals("DocumentWithSignature"))
                {
                    DSSXSDNamespace.DocumentWithSignature documentWithSignature = (DSSXSDNamespace.DocumentWithSignature)
                                                                                  FromDom("DocumentWithSignature", DSSConstants.DSS_NAMESPACE, optionalOutput,
                                                                                          typeof(DSSXSDNamespace.DocumentWithSignature));
                    return(documentWithSignature);
                }
            }

            return(null);
        }
        public byte[] Retrieve(String documentId)
        {
            Console.WriteLine("Retrieve");

            // setup client
            SetupClient();

            // create request
            String      requestId   = "dss-sign-request-" + Guid.NewGuid().ToString();
            SignRequest signRequest = new SignRequest();

            signRequest.RequestID = requestId;
            signRequest.Profile   = DSSConstants.ARTIFACT_NAMESPACE;

            // add "ReturnStoredDocument" optional input
            AnyType optionalInputs = new AnyType();

            DSSXSDNamespace.ReturnStoredDocument returnStoredDocument = new DSSXSDNamespace.ReturnStoredDocument();
            returnStoredDocument.Identifier = documentId;

            XmlElement returnStoredDocumentElement = ToDom("ReturnStoredDocument", DSSConstants.ARTIFACT_NAMESPACE,
                                                           returnStoredDocument, typeof(DSSXSDNamespace.ReturnStoredDocument));

            optionalInputs.Any         = new XmlElement[] { returnStoredDocumentElement };
            signRequest.OptionalInputs = optionalInputs;

            // operate
            SignResponse signResponse = this.client.sign(signRequest);

            // parse response
            CheckResponse(signResponse, requestId);

            try
            {
                ValidateResult(signResponse);
            }
            catch (NotParseableXMLDocumentException e)
            {
                throw new SystemException(e.Message, e);
            }

            // check profile
            if (!signResponse.Profile.Equals(DSSConstants.ARTIFACT_NAMESPACE))
            {
                throw new SystemException("Unexpected SignResponse.Profile: " + signResponse.Profile);
            }

            // get document
            DSSXSDNamespace.DocumentWithSignature documentWithSignature = FindDocumentWithSignature(signResponse);
            if (null == documentWithSignature || null == documentWithSignature.Document || null == documentWithSignature.Document.Item)
            {
                throw new DocumentNotFoundException();
            }
            byte[] documentData;

            if (documentWithSignature.Document.Item is DSSXSDNamespace.Base64Data)
            {
                documentData = ((DSSXSDNamespace.Base64Data)documentWithSignature.Document.Item).Value;
            }
            else
            {
                documentData = (byte[])documentWithSignature.Document.Item;
            }
            return(documentData);
        }