NetlinkEvent.cpp revision 168415b822cae1f8b54ef09c41c11a9b97b87f40
1168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat/*
2168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Copyright (C) 2008 The Android Open Source Project
3168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *
4168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Licensed under the Apache License, Version 2.0 (the "License");
5168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * you may not use this file except in compliance with the License.
6168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * You may obtain a copy of the License at
7168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *
8168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *      http://www.apache.org/licenses/LICENSE-2.0
9168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *
10168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Unless required by applicable law or agreed to in writing, software
11168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * distributed under the License is distributed on an "AS IS" BASIS,
12168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * See the License for the specific language governing permissions and
14168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * limitations under the License.
15168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat */
16168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <stdlib.h>
17168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
18168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#define LOG_TAG "NetlinkEvent"
19168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <cutils/log.h>
20168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
21168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <sysutils/NetlinkEvent.h>
22168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
23168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionUnknown = 0;
24168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionAdd = 1;
25168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionRemove = 2;
26168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionChange = 3;
27168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
28168415b822cae1f8b54ef09c41c11a9b97b87f40San MehatNetlinkEvent::NetlinkEvent() {
29168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    mAction = NlActionUnknown;
30168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
31168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
32168415b822cae1f8b54ef09c41c11a9b97b87f40San MehatNetlinkEvent::~NetlinkEvent() {
33168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
34168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    if (mPath)
35168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mPath);
36168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    if (mSubsystem)
37168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mSubsystem);
38168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    for (i = 0; i < NL_PARAMS_MAX; i++) {
39168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!mParams[i])
40168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            break;
41168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mParams[i]);
42168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
43168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
44168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
45168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatbool NetlinkEvent::decode(char *buffer, int size) {
46168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    char *s = buffer;
47168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    char *end;
48168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int param_idx = 0;
49168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
50168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int first = 1;
51168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
52168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    end = s + size;
53168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    while (s < end) {
54168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (first) {
55168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            char *p;
56168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            for (p = s; *p != '@'; p++);
57168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            p++;
58168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            mPath = strdup(p);
59168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            first = 0;
60168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        } else {
61168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            if (!strncmp(s, "ACTION=", strlen("ACTION="))) {
62168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                char *a = s + strlen("ACTION=");
63168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                if (!strcmp(a, "add"))
64168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionAdd;
65168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                else if (!strcmp(a, "remove"))
66168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionRemove;
67168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                else if (!strcmp(a, "change"))
68168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionChange;
69168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            } else if (!strncmp(s, "SEQNUM=", strlen("SEQNUM=")))
70168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mSeq = atoi(s + strlen("SEQNUM="));
71168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            else if (!strncmp(s, "SUBSYSTEM=", strlen("SUBSYSTEM=")))
72168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mSubsystem = strdup(s + strlen("SUBSYSTEM="));
73168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            else
74168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mParams[param_idx++] = strdup(s);
75168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        }
76168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        s+= strlen(s) + 1;
77168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
78168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    return true;
79168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
80168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
81168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst char *NetlinkEvent::findParam(const char *paramName) {
82168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
83168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
84168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    for (i = 0; i < NL_PARAMS_MAX; i++) {
85168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!mParams[i])
86168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            break;
87168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!strncmp(mParams[i], paramName, strlen(paramName)))
88168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            return &mParams[i][strlen(paramName) + 1];
89168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
90168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
91168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    LOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName);
92168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    return NULL;
93168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
94