00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00023 #include "scblog.h"
00024 #include "scbtype.h"
00025 #include "scbpages.h"
00026 #include <glib.h>
00027 #include "scbpage.h"
00028
00029
00030
00031
00032 void _page_release(gpointer data, gpointer userdata)
00033 {
00034 if (data)
00035 {
00036 scb_page_free((ScbPagePtr)data);
00037 }
00038 }
00039
00040
00041
00042 gboolean scb_pages_new(ScbPagesPtr ptr)
00043 {
00044 SCB_RET_FALSE_IF(NULL == ptr, "Invalid pointer!");
00045
00046 ptr->pages = g_list_alloc();
00047 if (NULL == ptr->pages)
00048 {
00049 SCB_ERROR("Could not allocate list!");
00050 return FALSE;
00051 }
00052 return TRUE;
00053 }
00054
00055
00056
00057 void scb_pages_free(ScbPagesPtr ptr)
00058 {
00059 if (ptr)
00060 {
00061
00062 g_list_foreach(ptr->pages, _page_release, NULL);
00063
00064
00065 g_list_free(ptr->pages);
00066 ptr->pages = NULL;
00067 }
00068 }
00069
00070
00071
00072
00073 gboolean scb_pages_add_page(ScbPagesPtr pages, ScbPagePtr page)
00074 {
00075 SCB_RET_FALSE_IF(NULL == pages || NULL == page, "Invalid pages or page pointer!");
00076
00077 ScbPagePtr pItem = NULL;
00078 GList* ptr = g_list_first(pages->pages);
00079 while(ptr)
00080 {
00081 pItem = ptr->data;
00082 if (pItem && 0 == strncmp(pItem->id.id, page->id.id, SCB_MAX_PAGEID_LEN))
00083 {
00084
00085
00086 return TRUE;
00087 }
00088 ptr = g_list_next(ptr);
00089 }
00090 g_list_append(pages->pages, page);
00091 return TRUE;
00092 }
00093
00094
00095
00096 ScbPagePtr scb_pages_detach_page(ScbPagesPtr pages, ScbPageIdPtr id)
00097 {
00098 ScbPagePtr pItem = NULL;
00099 GList* ptr = g_list_first(pages->pages);
00100 while(ptr)
00101 {
00102 pItem = ptr->data;
00103 if (pItem && 0 == strncmp(pItem->id.id, id->id, SCB_MAX_PAGEID_LEN))
00104 {
00105
00106 g_list_remove(pages->pages, pItem);
00107 return pItem;
00108 }
00109 ptr = g_list_next(ptr);
00110 }
00111 return NULL;
00112 }
00113
00114
00115
00116 void scb_pages_remove_page(ScbPagesPtr pages, ScbPageIdPtr id)
00117 {
00118 SCB_RET_IF(NULL == pages || NULL == id, "Invalid pointer!");
00119
00120 ScbPagePtr pItem = NULL;
00121 GList* ptr = g_list_first(pages->pages);
00122 while(ptr)
00123 {
00124 pItem = ptr->data;
00125 if (pItem && 0 == strncmp(pItem->id.id, id->id, SCB_MAX_PAGEID_LEN))
00126 {
00127
00128 scb_page_free(pItem);
00129 g_list_remove(pages->pages, ptr->data);
00130 return;
00131 }
00132 ptr = g_list_next(ptr);
00133 }
00134 }
00135
00136
00137
00138
00139 int scb_pages_get_count(ScbPagesPtr pages)
00140 {
00141 SCB_RET_INT_IF(NULL == pages, SCB_INVALID_COUNT, "Invalid pages pointer!");
00142 int len = g_list_length(pages->pages);
00143 if (len > 0)
00144 {
00145 return len - 1;
00146 }
00147 return SCB_INVALID_COUNT;
00148 }
00149
00150
00151
00152 ScbPagePtr scb_pages_get_page(ScbPagesPtr pages, ScbPageIdPtr id)
00153 {
00154 ScbPagePtr pItem = NULL;
00155 GList* ptr = g_list_first(pages->pages);
00156 while(ptr)
00157 {
00158 pItem = ptr->data;
00159 if (pItem && 0 == strncmp(pItem->id.id, id->id, SCB_MAX_PAGEID_LEN))
00160 {
00161
00162 return pItem;
00163 }
00164 ptr = g_list_next(ptr);
00165 }
00166 return NULL;
00167 }
00168
00169
00170
00171 gboolean scb_pages_change_page_id(ScbPagesPtr pages, ScbPageIdPtr oldId,
00172 ScbPageIdPtr newId)
00173 {
00174 ScbPagePtr pItem = NULL;
00175 GList* ptr = g_list_first(pages->pages);
00176 while(ptr)
00177 {
00178 pItem = ptr->data;
00179 if (pItem && 0 == strncmp(pItem->id.id, oldId->id, SCB_MAX_PAGEID_LEN))
00180 {
00181
00182 strncpy(pItem->id.id, newId->id, SCB_MAX_PAGEID_LEN);
00183 return TRUE;
00184 }
00185 ptr = g_list_next(ptr);
00186 }
00187 return FALSE;
00188 }
00189
00190
00191
00192 void _page_save(gpointer data, gpointer user_data)
00193 {
00194 if (data && user_data)
00195 {
00196 ScbXmlPtr ptr = (ScbXmlPtr)user_data;
00197 scb_page_save((ScbPagePtr)data, ptr);
00198 ++ptr->index;
00199 }
00200 }
00201
00202
00203
00204 gboolean scb_pages_save(ScbPagesPtr pages, ScbXmlPtr xml)
00205 {
00206 SCB_RET_FALSE_IF(NULL == pages || NULL == xml, "Invalid pointer!");
00207
00208 ScbXmlPtr self = scb_xml_clone(xml);
00209 self->index = 1;
00210 ermXmlNewString(&xml->handle, self->xPath, "pages", "");
00211 strncat(self->xPath, "/pages", SCB_MAX_XML_PATH);
00212 g_list_foreach(pages->pages, _page_save, self);
00213 scb_xml_free(self);
00214 return TRUE;
00215 }
00216
00217
00218
00219 gboolean scb_pages_load(ScbPagesPtr pages, ScbXmlPtr xml)
00220 {
00221
00222 SCB_RET_FALSE_IF(NULL == pages || NULL == xml, "Invalid pointer!");
00223
00224
00225 ScbXmlPtr self = scb_xml_clone(xml);
00226 strncat(self->xPath, "/pages", SCB_MAX_XML_PATH);
00227 self->index = 1;
00228
00229
00230 gboolean bLoad = TRUE;
00231 while (bLoad)
00232 {
00233 ScbPagePtr page = scb_page_new();
00234 bLoad = scb_page_load(page, self);
00235 if (bLoad)
00236 {
00237 scb_pages_add_page(pages, page);
00238 ++self->index;
00239 }
00240 else
00241 {
00242 scb_page_free(page);
00243 break;
00244 }
00245 }
00246 scb_xml_free(self);
00247 return TRUE;
00248 }
00249
00250
00251
00252 void _page_dump(gpointer data, gpointer userdata)
00253 {
00254 if (data)
00255 {
00256 scb_page_dump((ScbPagePtr)data);
00257 }
00258 }
00259
00260 void scb_pages_dump(ScbPagesPtr pages)
00261 {
00262 SCB_RET_IF(NULL == pages, "NULL pointer!");
00263 g_list_foreach(pages->pages, _page_dump, 0);
00264 }