GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: core/src/ux_host_stack_class_get.c Lines: 13 17 76.5 %
Date: 2024-12-12 17:16:36 Branches: 8 12 66.7 %

Line Branch Exec Source
1
/***************************************************************************
2
 * Copyright (c) 2024 Microsoft Corporation
3
 *
4
 * This program and the accompanying materials are made available under the
5
 * terms of the MIT License which is available at
6
 * https://opensource.org/licenses/MIT.
7
 *
8
 * SPDX-License-Identifier: MIT
9
 **************************************************************************/
10
11
12
/**************************************************************************/
13
/**************************************************************************/
14
/**                                                                       */
15
/** USBX Component                                                        */
16
/**                                                                       */
17
/**   Host Stack                                                          */
18
/**                                                                       */
19
/**************************************************************************/
20
/**************************************************************************/
21
22
23
/* Include necessary system files.  */
24
25
#define UX_SOURCE_CODE
26
27
#include "ux_api.h"
28
#include "ux_host_stack.h"
29
30
31
/**************************************************************************/
32
/*                                                                        */
33
/*  FUNCTION                                               RELEASE        */
34
/*                                                                        */
35
/*    _ux_host_stack_class_get                            PORTABLE C      */
36
/*                                                           6.3.0        */
37
/*  AUTHOR                                                                */
38
/*                                                                        */
39
/*    Chaoqiong Xiao, Microsoft Corporation                               */
40
/*                                                                        */
41
/*  DESCRIPTION                                                           */
42
/*                                                                        */
43
/*    This function returns a pointer to the class container. A class     */
44
/*    needs to obtain its container from the USBX stack to search for     */
45
/*    instances when a driver or an application wants to open a device.   */
46
/*                                                                        */
47
/*    Note: The C string of class_name must be NULL-terminated and the    */
48
/*    length of it (without the NULL-terminator itself) must be no larger */
49
/*    than UX_MAX_CLASS_NAME_LENGTH.                                      */
50
/*                                                                        */
51
/*  INPUT                                                                 */
52
/*                                                                        */
53
/*    class_name                            Name of class                 */
54
/*    host_class                            Class pointer                 */
55
/*                                                                        */
56
/*  OUTPUT                                                                */
57
/*                                                                        */
58
/*    Completion Status                                                   */
59
/*                                                                        */
60
/*  CALLS                                                                 */
61
/*                                                                        */
62
/*    _ux_utility_string_length_check       Check C string and return its */
63
/*                                          length if null-terminated     */
64
/*    _ux_utility_memory_compare            Compare memory blocks         */
65
/*                                                                        */
66
/*  CALLED BY                                                             */
67
/*                                                                        */
68
/*    Application                                                         */
69
/*    USBX Components                                                     */
70
/*                                                                        */
71
/*  RELEASE HISTORY                                                       */
72
/*                                                                        */
73
/*    DATE              NAME                      DESCRIPTION             */
74
/*                                                                        */
75
/*  05-19-2020     Chaoqiong Xiao           Initial Version 6.0           */
76
/*  09-30-2020     Chaoqiong Xiao           Modified comment(s),          */
77
/*                                            optimized based on compile  */
78
/*                                            definitions,                */
79
/*                                            resulting in version 6.1    */
80
/*  10-31-2023     Chaoqiong Xiao           Modified comment(s),          */
81
/*                                            resulting in version 6.3.0  */
82
/*                                                                        */
83
/**************************************************************************/
84
7433
UINT  _ux_host_stack_class_get(UCHAR *class_name, UX_HOST_CLASS **host_class)
85
{
86
87
UX_HOST_CLASS       *class_ptr;
88
#if !defined(UX_NAME_REFERENCED_BY_POINTER)
89
UINT                status;
90
7433
UINT                class_name_length =  0;
91
#endif
92
#if UX_MAX_CLASS_DRIVER > 1
93
ULONG               class_index;
94
#endif
95
96
#if !defined(UX_NAME_REFERENCED_BY_POINTER)
97
    /* Get the length of the class name (exclude null-terminator).  */
98
7433
    status =  _ux_utility_string_length_check(class_name, &class_name_length, UX_MAX_CLASS_NAME_LENGTH);
99
7433
    if (status)
100
1
        return(status);
101
#endif
102
103
    /* Get first class.  */
104
7432
    class_ptr =  _ux_system_host -> ux_system_host_class_array;
105
106
#if UX_MAX_CLASS_DRIVER > 1
107
    /* We need to parse the class driver table.  */
108
7675
    for (class_index = 0; class_index < _ux_system_host -> ux_system_host_max_class; class_index++)
109
    {
110
#endif
111
112
        /* Check if this class is already being used. */
113
7673
        if (class_ptr -> ux_host_class_status == UX_USED)
114
        {
115
116
            /* We have found a container. Check if this is the one we need (compare including null-terminator).  */
117
7658
            if (ux_utility_name_match(class_ptr -> ux_host_class_name, class_name, class_name_length + 1))
118
            {
119
120
                /* The class container was found. Update the pointer to the class container for the caller.  */
121
7430
                *host_class =  class_ptr;
122
123
                /* Return success.  */
124
7430
                return(UX_SUCCESS);
125
            }
126
        }
127
128
#if UX_MAX_CLASS_DRIVER > 1
129
        /* Move to the next class.  */
130
243
        class_ptr++;
131
    }
132
#endif
133
134
    /* If trace is enabled, insert this event into the trace buffer.  */
135
    UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_HOST_CLASS_UNKNOWN, class_name, 0, 0, UX_TRACE_ERRORS, 0, 0)
136
137
    /* This class does not exist, return an error.  */
138
2
    return(UX_HOST_CLASS_UNKNOWN);
139
}
140
141
142
/**************************************************************************/
143
/*                                                                        */
144
/*  FUNCTION                                               RELEASE        */
145
/*                                                                        */
146
/*    _uxe_host_stack_class_get                           PORTABLE C      */
147
/*                                                           6.3.0        */
148
/*  AUTHOR                                                                */
149
/*                                                                        */
150
/*    Chaoqiong Xiao, Microsoft Corporation                               */
151
/*                                                                        */
152
/*  DESCRIPTION                                                           */
153
/*                                                                        */
154
/*    This function checks errors in host stack class get function call.  */
155
/*                                                                        */
156
/*  INPUT                                                                 */
157
/*                                                                        */
158
/*    class_name                            Name of class                 */
159
/*    host_class                            Class pointer                 */
160
/*                                                                        */
161
/*  OUTPUT                                                                */
162
/*                                                                        */
163
/*    None                                                                */
164
/*                                                                        */
165
/*  CALLS                                                                 */
166
/*                                                                        */
167
/*    _ux_host_stack_class_get              Host stack class get          */
168
/*                                                                        */
169
/*  CALLED BY                                                             */
170
/*                                                                        */
171
/*    Application                                                         */
172
/*                                                                        */
173
/*  RELEASE HISTORY                                                       */
174
/*                                                                        */
175
/*    DATE              NAME                      DESCRIPTION             */
176
/*                                                                        */
177
/*  10-31-2023     Chaoqiong Xiao           Initial Version 6.3.0         */
178
/*                                                                        */
179
/**************************************************************************/
180
UINT  _uxe_host_stack_class_get(UCHAR *class_name, UX_HOST_CLASS **host_class)
181
{
182
183
    /* Sanity checks.  */
184
    if ((class_name == UX_NULL) || (host_class == UX_NULL))
185
        return(UX_INVALID_PARAMETER);
186
187
    /* Invoke class get function.  */
188
    return(_ux_host_stack_class_get(class_name, host_class));
189
}