ICustomExtractDriver Interface

When implemented, represents a custom driver used to write data to/read data from a data extract.

Namespace: DevExpress.DashboardCommon

Assembly: DevExpress.Dashboard.v19.2.Core.dll

Declaration

public interface ICustomExtractDriver
Public Interface ICustomExtractDriver

Remarks

ICustomExtractDriver allows you to implement a custom logic for writing/reading data extracts (DashboardExtractDataSource). To facilitate these operations, a data extract is divided into special chunks called pages. Each page within a data extract can be accessed by a unique identifier (GUID).

The ICustomExtractDriver interface exposes two methods to be implemented.

After you have implemented a custom driver, you can substitute a default extract driver using the ExtractDriverStorage.DefaultDriver property. In this case, a new driver will be used for all data extracts. As an alternative, you can use a new driver for the specific data extract. To do this, register a custom driver within the ExtractDriverStorage by calling the ExtractDriverStorage.RegisterCustomDriver method. Then, assign the name of this driver to the DashboardExtractDataSource.DriverName property.

Examples

This example demonstrates how to create a custom driver to encrypt/decrypt extract data. It implements the ICustomExtractDriver interface:

Note

The complete sample project How to Encrypt/Decrypt Data Transfer Between the Data Extract File and a Dashboard is available in the DevExpress Examples repository.

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using DevExpress.DashboardCommon;

namespace Dashboard_CustomExtractDriver {
    public class ExtractEncryptionDriver : ICustomExtractDriver {

        public IDriverReadSession CreateReadSession(string resourceName) {
            return new EncryptionReadSession(FileExtractDriver.Instance.CreateReadSession(resourceName));
        }
        public IDriverWriteSession CreateWriteSession(string resourceName) {
            return new EncryptionWriteSession(FileExtractDriver.Instance.CreateWriteSession(resourceName));
        }
    }

    public class EncryptionWriteSession : IDriverWriteSession {
        IDriverWriteSession writeSession;

        public EncryptionWriteSession(IDriverWriteSession writeSession) {
            this.writeSession = writeSession; 
        }
        public void Dispose() {
            writeSession.Dispose();
        }
        public void SetPage(Guid pageID, byte[] data) {
            writeSession.SetPage(pageID, Encrypt(data));
        }
        byte[] Encrypt(byte[] page) {
            byte[] entropy = { 1, 2, 3 };
            byte[] encryptedPage = ProtectedData.Protect(page, entropy, DataProtectionScope.CurrentUser);
            return encryptedPage;
        }
    }

    public class EncryptionReadSession : IDriverReadSession {
        IDriverReadSession readSession;
        public EncryptionReadSession(IDriverReadSession readSession) {
            this.readSession = readSession;
        }
        public void Dispose() {
            readSession.Dispose();
        }
        byte[] Decrypt(byte[] page) {
            byte[] entropy = { 1, 2, 3 };
            byte[] decryptedPage = ProtectedData.Unprotect(page, entropy, DataProtectionScope.CurrentUser);
            return decryptedPage;
        }
        public byte[] GetPage(Guid pageID) {
            return Decrypt(readSession.GetPage(pageID));
        }
        public IEnumerable<Guid> GetPageIDs() {
            return readSession.GetPageIDs();
        }
    }
}
See Also