首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

SideShow Gadget 本地儲存實現:離線自動恢復機制

     編輯:關於.NET

背景:標準 SideShow 裝置連接 PC 由管理中心添加 Gadget,裝置緩存至記憶體。斷電重啟後所有 Gadget 資訊遺失。本功能讓裝置重啟自動恢復原有 Gadget。

架構關係圖

SideShow 模組關係

  • 啟動:主介面優先啟動顯示本地 Gadget 與系統資訊;Message 組件接管 PC 通訊,新 Gadget 經此通道添加,畫面/狀態持續同步。
  • UI 引擎動態從 Cache 取得介面元素。

本地儲存實現思路

單純持久化 Cache 不足,因 Gadget 載入需 Message 組件觸發消息循環。最直接方式:**攔截並持久化關鍵消息**,啟動時(離線狀態)重播消息,模擬聯機交互流程,實現動態載入(資料非即時)。

需持久化的 74 種消息中 6 類關鍵指令

序號名稱值說明
1AddApp0x010D添加 Gadget
2DeleteApp0x010E刪除指定 Gadget
3DeleteAllApps0x010F刪除全部 Gadget
4AddContentItem0x0114添加 Gadget 內容項
5DeleteContentItem0x0115刪除指定內容項(效能考量未處理)
6DeleteAllContentItems0x0116刪除 Gadget 所有內容項(效能考量未處理)

儲存格式

  • 根目錄 ROOT\GADGET_CACHE
  • 每 Gadget 以 GUID 命名子目錄,含 index.App(名稱/圖示)與 {ContentId}.Content(內容資料)

核心類別 GadgetCache

public class GadgetCache {
    public static bool OnlineFlag = false;
    public static bool RunFlag = false;
    public static int CheckCachedDirectory();
    public static string[] EnumApps();
    public static string[] EnumContentItems(string AppId);
    public static int LoadApp(string AppId, out byte[] data);
    public static int SaveApp(string AppId, byte[] data);
    public static int DeleteApp(string AppId);
    public static int DeleteAllApps();
    public static int LoadContentItem(string AppId, string ContentId, out byte[] data);
    public static int SaveContentItem(string AppId, string ContentId, byte[] data);
    public static int DeleteContentItem(string AppId, string ContentId);
    public static int DeleteAllContentItems(string AppId);
}

消息處理與持久化觸發點(PcMessageHandler.cs)

case PacketType.AddApp:
    // ... shell.ConnectClient(...)
    if (!GadgetCache.RunFlag) GadgetCache.SaveApp(appId.ToString(), msg.Payload);
    break;
case PacketType.AddContentItem:
    // ... cacheMgr.AddItem(...)
    if (!GadgetCache.RunFlag) GadgetCache.SaveContentItem(appId.ToString(), contentId.ToString(), msg.Payload);
    break;
// Delete 類似

啟動時讀取與恢復(PcMessageHandler.cs)

new Thread(Load_Gadget).Start(); // 在 Initialize 中啟動
void Load_Gadget() {
    Thread.Sleep(3000);
    if (!GadgetCache.OnlineFlag) {
        GadgetCache.RunFlag = true;
        foreach (var appId in GadgetCache.EnumApps()) {
            if (GadgetCache.OnlineFlag) { GadgetCache.RunFlag = false; return; }
            GadgetCache.LoadApp(appId, out byte[] data);
            ProcessMessage(GadgetCache.ToAuxMessage(269, data)); // AddApp
            foreach (var cid in GadgetCache.EnumContentItems(appId)) {
                if (GadgetCache.OnlineFlag) { GadgetCache.RunFlag = false; return; }
                GadgetCache.LoadContentItem(appId, cid, out data);
                ProcessMessage(GadgetCache.ToAuxMessage(276, data)); // AddContentItem
            }
        }
        GadgetCache.RunFlag = false;
    }
}

調試環境

官方模擬器不支援檔案系統,自行擴展 MF 模擬器支援 SideShow,可模擬連線/離線切換(需 VS2008 管理員權限)。
離線模式 聯機模式

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved