public StorageInfoDO Store(byte[] documentData, String contentType)
        {
            Console.WriteLine("Store");

            // setup the client
            SetupClient();

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

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

            // add "ReturnStorageInfo" optional input
            AnyType    optionalInputs           = new AnyType();
            XmlElement returnStorageInfoElement = GetElement("artifact", "ReturnStorageInfo", DSSConstants.ARTIFACT_NAMESPACE);

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

            // add document
            signRequest.InputDocuments = GetInputDocuments(documentData, contentType);

            // operate
            SignResponse signResponse = 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);
            }

            // parse StorageInfo
            DSSXSDNamespace.StorageInfo storageInfo = FindStorageInfo(signResponse);
            if (null == storageInfo)
            {
                throw new SystemException("Missing StorageInfo");
            }

            return(new StorageInfoDO(storageInfo.Identifier, storageInfo.Validity.NotBefore, storageInfo.Validity.NotAfter));
        }
        private DSSXSDNamespace.StorageInfo FindStorageInfo(SignResponse signResponse)
        {
            if (null == signResponse.OptionalOutputs)
            {
                return(null);
            }
            foreach (XmlElement optionalOutput in signResponse.OptionalOutputs.Any)
            {
                if (optionalOutput.NamespaceURI.Equals(DSSConstants.ARTIFACT_NAMESPACE) &&
                    optionalOutput.LocalName.Equals("StorageInfo"))
                {
                    DSSXSDNamespace.StorageInfo storageInfo = (DSSXSDNamespace.StorageInfo)FromDom("StorageInfo",
                                                                                                   DSSConstants.ARTIFACT_NAMESPACE, optionalOutput, typeof(DSSXSDNamespace.StorageInfo));
                    return(storageInfo);
                }
            }

            return(null);
        }