+static MonoBoolean
+get_network_counter (ImplVtable *vtable, MonoBoolean only_value, MonoCounterSample *sample)
+{
+ MonoNetworkError error = MONO_NETWORK_ERROR_OTHER;
+ NetworkVtableArg *narg = (NetworkVtableArg*) vtable->arg;
+ if (!only_value) {
+ fill_sample (sample);
+ }
+
+ sample->counterType = predef_counters [predef_categories [CATEGORY_NETWORK].first_counter + narg->id].type;
+ switch (narg->id) {
+ case COUNTER_NETWORK_BYTESRECSEC:
+ sample->rawValue = mono_network_get_data (narg->name, MONO_NETWORK_BYTESREC, &error);
+ break;
+ case COUNTER_NETWORK_BYTESSENTSEC:
+ sample->rawValue = mono_network_get_data (narg->name, MONO_NETWORK_BYTESSENT, &error);
+ break;
+ case COUNTER_NETWORK_BYTESTOTALSEC:
+ sample->rawValue = mono_network_get_data (narg->name, MONO_NETWORK_BYTESTOTAL, &error);
+ break;
+ }
+
+ if (error == MONO_NETWORK_ERROR_NONE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void
+network_cleanup (ImplVtable *vtable)
+{
+ NetworkVtableArg *narg;
+
+ if (vtable == NULL)
+ return;
+
+ narg = vtable->arg;
+ if (narg == NULL)
+ return;
+
+ g_free (narg->name);
+ narg->name = NULL;
+ g_free (narg);
+ vtable->arg = NULL;
+}
+
+static void*
+network_get_impl (MonoString* counter, MonoString* instance, int *type, MonoBoolean *custom)
+{
+ const CounterDesc *cdesc;
+ NetworkVtableArg *narg;
+ ImplVtable *vtable;
+ char *instance_name;
+
+ *custom = FALSE;
+ if ((cdesc = get_counter_in_category (&predef_categories [CATEGORY_NETWORK], counter))) {
+ instance_name = mono_string_to_utf8 (instance);
+ narg = g_new0 (NetworkVtableArg, 1);
+ narg->id = cdesc->id;
+ narg->name = instance_name;
+ *type = cdesc->type;
+ vtable = create_vtable (narg, get_network_counter, NULL);
+ vtable->cleanup = network_cleanup;
+ return vtable;
+ }
+ return NULL;
+}
+