Notification launch support. (TIVI-2926/1892)
[profile/ivi/ico-uxf-homescreen.git] / lib / system-controller / CicoSCLayer.cpp
1 /*
2  * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9
10 /*========================================================================*/
11 /**
12  *  @file   CicoSCLayer.cpp
13  *
14  *  @brief  This file is implementation of CicoSCLayer class
15  */
16 /*========================================================================*/
17
18 #include <stdlib.h>
19 #include <string.h>
20 #include "CicoSCLayer.h"
21 #include "CicoLog.h"
22
23 //--------------------------------------------------------------------------
24 /**
25  *  @brief  default constructor
26  */
27 //--------------------------------------------------------------------------
28 CicoSCLayer::CicoSCLayer()
29     : layerid(-1), type(-1), width(-1), height(-1),
30       displayid(-1), numsurfaces(0), menuoverlap(false)
31
32 {
33     surfaceids = (int *)malloc(40 * sizeof(int));
34     if (surfaceids) {
35         maxsurfaces = 50;
36     }
37 }
38
39 //--------------------------------------------------------------------------
40 /**
41  *  @brief  destructor
42  */
43 //--------------------------------------------------------------------------
44 CicoSCLayer::~CicoSCLayer()
45 {
46     if (surfaceids) {
47         maxsurfaces = 0;
48         numsurfaces = 0;
49         free(surfaceids);
50         surfaceids = NULL;
51     }
52 }
53
54 //--------------------------------------------------------------------------
55 /**
56  *  @brief  addSurface
57  */
58 //--------------------------------------------------------------------------
59 void
60 CicoSCLayer::addSurface(int surfaceid, bool top)
61 {
62     int     idx, idx2;
63     int     *wksurfaceids;
64     ICO_DBG("CicoSCLayer::addSurface(%08x,%d)", surfaceid, top);
65
66     idx2 = 0;
67     for (idx = 0; idx < numsurfaces; idx++, idx2++) {
68         if (surfaceids[idx] == surfaceid)   {
69             idx2 --;
70         }
71         else    {
72             surfaceids[idx2] = surfaceids[idx];
73         }
74     }
75     numsurfaces = idx2;
76
77     if (numsurfaces >= maxsurfaces) {
78         maxsurfaces += 20;
79         wksurfaceids = (int *)malloc(maxsurfaces * sizeof(int));
80         if (! wksurfaceids) {
81             ICO_ERR("CicoSCLayer::addSurface: Out of Memory");
82             return;
83         }
84         if (surfaceids) {
85             memcpy(wksurfaceids, surfaceids, numsurfaces * sizeof(int));
86             free(surfaceids);
87         }
88         surfaceids = wksurfaceids;
89     }
90     if (top)    {
91         surfaceids[numsurfaces] = surfaceid;
92     }
93     else    {
94         for (idx = numsurfaces; idx > 0; idx--) {
95             surfaceids[idx] = surfaceids[idx-1];
96         }
97         surfaceids[0] = surfaceid;
98     }
99     numsurfaces ++;
100 }
101
102 //--------------------------------------------------------------------------
103 /**
104  *  @brief  removeSurface
105  */
106 //--------------------------------------------------------------------------
107 void
108 CicoSCLayer::removeSurface(int surfaceid)
109 {
110     int     idx, idx2;
111     ICO_DBG("CicoSCLayer::removeSurface(%08x)", surfaceid);
112
113     idx2 = 0;
114     for (idx = 0; idx < numsurfaces; idx++, idx2++) {
115         if (surfaceids[idx] == surfaceid)   {
116             idx2 --;
117         }
118         else    {
119             surfaceids[idx2] = surfaceids[idx];
120         }
121     }
122     numsurfaces = idx2;
123 }
124
125 //--------------------------------------------------------------------------
126 /**
127  *  @brief  is_topSurface
128  */
129 //--------------------------------------------------------------------------
130 bool
131 CicoSCLayer::is_topSurface(int surfaceid)
132 {
133     return (numsurfaces > 0) && (surfaceids[numsurfaces-1] == surfaceid);
134 }
135
136 //--------------------------------------------------------------------------
137 /**
138  *  @brief  is_buttomSurface
139  */
140 //--------------------------------------------------------------------------
141 bool
142 CicoSCLayer::is_buttomSurface(int surfaceid)
143 {
144     return (numsurfaces > 0) && (surfaceids[0] == surfaceid);
145 }
146
147 //--------------------------------------------------------------------------
148 /**
149  *  @brief  getSurfaces
150  */
151 //--------------------------------------------------------------------------
152 const int *
153 CicoSCLayer::getSurfaces(int *retsurfaces)
154 {
155     *retsurfaces = numsurfaces;
156     return surfaceids;
157 }
158
159 //--------------------------------------------------------------------------
160 /**
161  *  @brief  dump log this class member variables
162  */
163 //--------------------------------------------------------------------------
164 void
165 CicoSCLayer::dump(void)
166 {
167     ICO_DBG("CicoSCLayer: layerid=%d type=%d width=%d height=%d "
168             "displayid =%d menuoverlap=%s",
169             layerid, type, width, height, displayid,
170             menuoverlap ? "true" : "false");
171 }
172 // vim:set expandtab ts=4 sw=4: