# Whiteboard sharing

<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

The Video SDK for Windows lets an app share a whiteboard within a session, allowing users to start, view, and collaborate on a digital canvas. Manage this feature through the dedicated `IZoomVideoSDKWhiteboardHelper`.

## Integrate the module

To add whiteboard support to your app, you will primarily use the `IZoomVideoSDKWhiteboardHelper` interface, which is part of the `IZoomVideoSDKShareHelper` interface. You can also manage events using the `IZoomVideoSDKDelegate` protocol.

    ```cpp
    // Include the necessary Zoom Video SDK header files
    #include "zoom_video_sdk.h"
    #include "zoom_video_sdk_whiteboard_helper_interface.h"

    // Get the main SDK instance, or create it if is isn't made yet
    IZoomVideoSDK* pVideoSDK = ZoomVideoSDKMgr::CreateZoomVideoSDKObj();
    ```

## Share and manage the whiteboard

These helper classes are available for you to manage the whiteboard.

| Method                      | Purpose                                                            |
| --------------------------- | ------------------------------------------------------------------ |
| `getWhiteboardHelper()`     | Retrieves the instance of the whiteboard helper.                   |
| `canStartShareWhiteboard()` | Checks if the current user is permitted to start a new whiteboard. |
| `startShareWhiteboard()`    | Starts a new, blank whiteboard session.                            |
| `canStopShareWhiteboard()`  | Checks if the current user can stop the active whiteboard share.   |
| `stopShareWhiteboard()`     | Stops the current whiteboard share.                                |

    ```cpp
    // 1. Get the Whiteboard Helper
    IZoomVideoSDKWhiteboardHelper* pWhiteboardHelper =
        pVideoSDK->getShareHelper()->getWhiteboardHelper();

    // 2. Start Sharing
    if (pWhiteboardHelper->CanStartShareWhiteboard()) {
        ZoomVideoSDKErrors result = pWhiteboardHelper->startShareWhiteboard();
        // Check 'result' for success (ZoomVideoSDKErrors_Success)
    }

    // 3. Stop Sharing
    if (pWhiteboardHelper->canStopShareWhiteboard()) {
        ZoomVideoSDKErrors result = pWhiteboardHelper->stopShareWhiteboard();
        // Check 'result' for success
    }
    ```

## View or subscribe to the whiteboard

Use the SDK interfaces `subscribeWhiteboard`, `unSubscribeWhiteboard`, and `setCustomizedResIcon` to control the display of the whiteboard in a dedicated window or view.
| Method | Purpose |
|---------------------------------------------------------------------|-----------------------------------------------------------------------|
| `subscribeWhiteboard(void* hOwner)` | Displays the whiteboard view. `hOwner` is the handle of the owner window (or `nullptr` for desktop owner). |
| `unSubscribeWhiteboard()` | Closes the whiteboard view. |
| `setCustomizedResIcon(void* hResInstance, unsigned int iconID)` | Sets a custom icon for the whiteboard view window. |
| `isOtherSharingWhiteboard` | Checks if any other user is currently sharing a whiteboard. |

### To view the whiteboard

```cpp
// Get the helper as shown above
IZoomVideoSDKWhiteboardHelper* pWhiteboardHelper =
    pVideoSDK->getShareHelper()->getWhiteboardHelper();

// 1. Subscribe to the whiteboard on your selected owner window (e.g., your application's main window handle)
// HWND hMainWnd = ...; // Get your window handle
void* hOwner = (void*)hMainWnd;

ZoomVideoSDKErrors result = pWhiteboardHelper->subscribeWhiteboard(hOwner);
// The whiteboard UI will now be displayed, owned by hOwner
```

### To stop viewing the whiteboard

```cpp
// Get the helper as shown above
IZoomVideoSDKWhiteboardHelper* pWhiteboardHelper =
    pVideoSDK->getShareHelper()->getWhiteboardHelper();

pWhiteboardHelper->unSubscribeWhiteboard();
```

## Whiteboard events and status changes

You'll handle whiteboard events by implementing the `IZoomVideoSDKDelegate` interface.

| CallbackMethod                                                                                                   | Purpose                                                                                                  |
| ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `onUserWhiteboardShareStatusChanged(IZoomVideoSDKUser* pUser, IZoomVideoSDKWhiteboardHelper* pWhiteboardHelper)` | Called when any user starts or stops sharing a whiteboard. This is your cue to subscribe or unsubscribe. |
| `IZoomVideoSDKUser::GetWhiteboardStatus()`                                                                       | Returns a user's current whiteboard status (`WhiteboardStatus_Started` or `WhiteboardStatus_Stopped`).   |

```cpp
// Implement this method in your class that inherits IZoomVideoSDKDelegate

void YourSDKDelegateClass::onUserWhiteboardShareStatusChanged(IZoomVideoSDKUser* pUser, IZoomVideoSDKWhiteboardHelper* pWhiteboardHelper) {

    // HWND hMainWnd = ...; // Get your window handle
    void* hOwner = (void*)hMainWnd;

    ZoomVideoSDKWhiteboardStatus status = pUser->getWhiteboardStatus();

    if (status == WhiteboardStatus_Started) {
        // A user has started sharing a whiteboard. Subscribe to the whiteboard view.
        pWhiteboardHelper->subscribeWhiteboard(hOwner);

        // Note: Windows Whiteboard Helper does not have setWhiteboardViewPos/Size.
        // The view position is managed by the SDK relative to hOwner.

    } else if (status == WhiteboardStatus_Stopped) {
        // The whiteboard sharing has ended. Unsubscribe to close the view.
        pWhiteboardHelper->unSubscribeWhiteboard();
    }
}

```

## Export whiteboard content

Export the whiteboard as a PDF document.

| Method/Enum                                                                               | Purpose                                                                                     |
| ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `exportWhiteboard(ZoomVideoSDKExportFormat format)`                                       | Triggers the asynchronous export process. Currently supports `EXPORT_FORMAT_PDF`.           |
| `ZoomVideoSDKExportFormat`                                                                | The enum value to specify PDF as the export format.                                         |
| `onWhiteboardExported(ZoomVideoSDKExportFormat format, unsigned char* data, long length)` | The delegate callback that provides the exported file data as an `unsigned char *` pointer. |

### To export and retrieve the data

```cpp
// 1. Trigger the export
IZoomVideoSDKWhiteboardHelper* pWhiteboardHelper =
    pVideoSDK->getShareHelper()->getWhiteboardHelper();

pWhiteboardHelper->exportWhiteboard(EXPORT_FORMAT_PDF);

// 2. Receive the data in your delegate
void YourSDKDelegateClass::onWhiteboardExported(ZoomVideoSDKExportFormat format, unsigned char* data, long length) {

    if (format == EXPORT_FORMAT_PDF) {
        // 'data' is the unsigned char* pointer to the PDF file data.
        // 'length' is the size of the data buffer.
        // You can now write this data to a file on the device.
        SavePdfFile(data, length);
    }
}

```

## Manage the data

Because the whiteboard data isn't stored in the cloud, you'll need to handle the data storage. Data can be lost when someone stops sharing the whiteboard, a user leaves a session, or when a user joins a sub-session, or when the app crashes or has network connectivity issues.
