/
feature.c
120 lines (98 loc) · 2.5 KB
/
feature.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* feature.c --
*
* Author : Maxime Soulé
* Created On : Sun Mar 27 17:22:46 2005
* Last Modified By:
* Last Modified On:
* Update Count : 0
* Status : Unknown, Use with caution!
*
*
* ==================== RCS ====================
* $Author$
* $Log$
* ==================== RCS ==================== */
#define EXTERN_FEATURE
#include "feature.h"
#if 0
EXTERN_MISC void *feature_mem_new(UInt16 uh_feature, UInt16 uh_size);
EXTERN_MISC void feature_mem_free(UInt16 uh_feature, void *pv_ptr);
EXTERN_MISC void *feature_mem_get(UInt16 uh_feature);
#define feature_mem_unlock(pv_ptr) MemPtrUnlock(pv_ptr)
if (0)
{
Char ra_test[] = "Test pour voir";
Char *pa_mesg;
pa_mesg = feature_mem_get(0xA1a7);
if (pa_mesg != NULL)
{
// On affiche
WinPrintf("Contenu = '%s'", pa_mesg);
DmWrite(pa_mesg, 0, &pa_mesg[1], sizeof(ra_test) - 1);
//feature_mem_free(0xA1a7, pa_mesg);
}
else
{
pa_mesg = feature_mem_new(0xA1a7, sizeof(ra_test));
if (pa_mesg == NULL)
WinPrintf("NULL");
else
{
DmWrite(pa_mesg, 0, ra_test, sizeof(ra_test));
feature_mem_unlock(pa_mesg);
WinPrintf("Création OK");
}
}
}
#endif
void *feature_mem_new(UInt16 uh_feature, UInt16 uh_size)
{
MemHandle pv_mem;
void *pv_ptr = NULL;
DmOpenRef db;
LocalID ui_lid;
UInt16 uh_cardno;
// La feature existe déjŕ, on la redimensionne
if (FtrGet(MaTiCreatorID, uh_feature, (UInt32*)&pv_mem) == 0)
{
if (MemHandleSize(pv_mem) != uh_size)
MemHandleResize(pv_mem, uh_size);
goto end_ok;
}
// Handle sur la męme carte que notre application
SysCurAppDatabase(&uh_cardno, &ui_lid);
db = DmOpenDatabase(uh_cardno, ui_lid, dmModeReadOnly);
pv_mem = DmNewHandle(db, uh_size);
DmCloseDatabase(db);
if (pv_mem != NULL)
{
// Mise en place de la feature
if (FtrSet(MaTiCreatorID, uh_feature, (UInt32)pv_mem) != 0)
MemHandleFree(pv_mem);
else
{
end_ok:
pv_ptr = MemHandleLock(pv_mem);
}
}
return pv_ptr;
}
// feature_mem_unlock() doit ętre appelée lorsque le chunk ne sert plus
void *feature_mem_get(UInt16 uh_feature)
{
MemHandle pv_mem;
if (FtrGet(MaTiCreatorID, uh_feature, (UInt32*)&pv_mem) != 0)
return NULL;
return MemHandleLock(pv_mem);
}
void feature_mem_free(UInt16 uh_feature, void *pv_ptr)
{
FtrUnregister(MaTiCreatorID, uh_feature);
if (pv_ptr != NULL)
{
MemHandle pv_mem = MemPtrRecoverHandle(pv_ptr);
MemHandleUnlock(pv_mem);
MemHandleFree(pv_mem);
}
}