知识总结

  1. 双向循环链表的好处:操作方便进行给定结点的删除时可以不需要像单向链表一样需要前后指针才能进行操作,直接可以定位到该结点进行删除,效率更高

总体概述

主要是通用管理器的初始化包括deviceid的读写加密,设备信息的本地化保存以及链表操作功能函数的具体代码

代码详解

common_info_manager.h

作为头文件,最主要就是定义结构体和函数。而该头文件定义了两个重要的结构体:设备信息和双向链表

deviceInfo结构体:通过函数获取设备信息后存入该结构体中,然后通过各种验证后得到的信息再写入localDeviceInfo和g_deviceInfo中
List结构体:会话密钥的存储等使用的数据结构都是List,操作方便,使用简单高效

  1. 定义了不同平台对应的type:L0 L1
    在这里插入图片描述
  2. 定义了重要的结构体DeviceInfo用于保存接入设备的各种信息包括名称、id、IP、版本、软总线版本、软件版本、网络名称、设备端口、设备类型、网络状态、可信状态等承担了最初的设备信息的获取存储任务
    在这里插入图片描述
  3. 定义了鸿蒙中使用最广泛的数据结构双向链表的结构体和操作函数
    在这里插入图片描述
  4. 宏定义了用于链表遍历的FOR模块头
    在这里插入图片描述

common_info_manager.c

主要涉及deviceid的获取->加密->存储
本地信息的初始化和删除
以及链表的操作功能函数

  1. 重要的定义DEVICE_ID_FILE
    在这里插入图片描述
    从该路径文件中进行deviceid的读写

  2. 根据规则使用data所指的数据对str进行加密
    在这里插入图片描述
    使用该函数将获取的deviceid进行加密

  3. 条件编译读取文件中deviceid的函数(Linux)
    在这里插入图片描述

  4. 读取deviceid的函数,包含了两种类型设备的读取方法(RISCV LINUX)
    在这里插入图片描述
    在这里插入图片描述

  5. deviceid写入函数(同样考虑到了两种类型设备的写入情况)
    在这里插入图片描述

  6. 将上述函数打包封装为一个完整的流程
    读取deviceId->生成随机数密钥->通过获取的data加密deviceid->将加密后的deviceId写回
    在这里插入图片描述

  7. 更新并登记本地设备信息
    在这里插入图片描述

  8. 初始化全局本地信息(g_deviceInfo)
    在这里插入图片描述

  9. 顶层调用初始化和删除通用管理器
    在这里插入图片描述

  10. 剩下的函数都为双向链表的操作函数包括头结点的初始化;头结点后的插入;链表尾部的插入;结点的删除;链表判空;得到第一个链表块;第一个链表结点的删除释放;链表长度的计算等
    代码比较简单直接查看源码注释即可

//链表的操作函数
void ListInitHead(List *head)
{
    head->next = head;
    head->prev = head;
}

void ListInsertHead(List *head, List *node)
{
    node->next = head->next;
    node->next->prev = node;
    node->prev = head;
    head->next = node;
}

void ListInsertTail(List *head, List *node)
{
    node->prev = head->prev;
    //头的前指针指向新插入结点
    node->prev->next = node;
    //新插入结点前指针的后结点——也就是指向头的原链表的最后一个结点的后指针指向新结点
    node->next = head;
    //新插入结点的后指针指向头结点
    head->prev = node;
    //头结点的前指针指向新插入结点
    //至此完成了新插入结点加入链表尾部的操作
}

//双向链表的好处:不需要从头遍历找到该结点才能删除,给定一个结点就可以进行操作
void ListRemoveNode(List *node)
{
    if (node == NULL) {
        return;
    }
    node->next->prev = node->prev;
    node->prev->next = node->next;
    node->next = NULL;
    node->prev = NULL;
}

//判断是否有实际数据存在链表中
int ListIsEmpty(List *head)
{
    return (head == head->next);
}

//得到第一个链表块
List *ListGetFront(List *head)
{
    return head->next;
}

//将第一个链表块释放删除
List *ListPopFront(List *head)
{
    List *element = NULL;
    //新建结点并判断链表是否存在
    if (head == NULL || ListIsEmpty(head)) {
        return NULL;
    }

    element = head->next;
    //头结点的下一个也就是第一个连接的块
    ListRemoveNode(element);
    return element;
    //将其从链表中移除并返回它
}

//计算链表的长度
int ListLength(const List *head)
{
    int len = 0;
    List *pos = NULL;
    List *tmp = NULL;

    LIST_FOR_EACH_SAFE(pos, tmp, head) {
        len++;
    }

    return len;
}

感谢阅读点赞与评论!

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐