00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00039
00040 #include "SO3SCOL.h"
00041
00042
00043 #include "../SO3Renderer/SO3Root.h"
00044 #include "../SO3Renderer/SO3LogListener.h"
00045
00046 int SO3LOGS;
00047 int SO3_LOGS_MSG;
00048
00049
00050 class ScolLogEventsListener : public SLogListener
00051 {
00052 public:
00053 protected:
00054 private:
00055 WindowHandle windowHandleScol;
00056
00057 public:
00060 ScolLogEventsListener(WindowHandle windowHandle)
00061 {
00062 windowHandleScol = windowHandle;
00063 };
00064
00065 virtual void messageLogged(const Ogre::String& message)
00066 {
00067 char* cmess = (char*)malloc(sizeof(char*) * (message.length() + 1));
00068 std::strcpy(cmess, message.c_str());
00069
00070 PostMessage(windowHandleScol, SO3_LOGS_MSG, (int)SRoot::getSingletonPtr(), (LPARAM)cmess);
00071 }
00072
00073 protected:
00074 private:
00078 ScolLogEventsListener()
00079 {
00080 };
00081 };
00082
00083
00087 ScolLogEventsListener* scolLogEventsListener = 0;
00088
00089
00098 int destroyLogs(mmachine m, int handle, int obj)
00099 {
00100 #ifdef SO3_DEBUG
00101 MMechostr(MSKDEBUG,"destroyLogs \n");
00102 #endif
00103
00104 SRoot::getSingleton().SetLogEnable(false);
00105
00106 MMstore(m, MTOP(obj), 0, NULL);
00107 return 0;
00108 }
00109
00110
00122 int getLogCallback(mmachine m, WindowHandle h,unsigned msg,UINT id,LONG param,int *ret)
00123 {
00124 #ifdef SO3_DEBUG
00125 MMechostr(MSKDEBUG, "getLogCallback\n");
00126 #endif
00127
00128 int k = 0;
00129 int obj = 0;
00130
00131 if(SRoot::getSingletonPtr() == 0)
00132 return -1;
00133
00134
00135
00136 obj = OBJfindTH(m, SO3LOGS, id);
00137 if (obj == NIL)
00138 return -1;
00139
00140 if (MMfetch(m, obj, OFFOBJREF0+SO3_LOGS_CB*2)==NIL)
00141 return -1;
00142
00143
00144
00145 MMsetglobal(m, OFFSCCUR, MMfetch(m, obj, OFFOBJCHN));
00146 if (MMpush(m, MMgetglobal(m, OFFSCCUR))) return MERRMEM;
00147
00148
00149 if (MMpush(m, MMfetch(m, obj, OFFOBJREF0+SO3_LOGS_CB*2))) return MERRMEM;
00150
00151
00152 if (Mpushstrbloc(m, (char*)param)) return MERRMEM;
00153
00154
00155 if (MMpush(m, MMfetch(m, obj, OFFOBJREF0+SO3_LOGS_CB*2+1))) return MERRMEM;
00156
00157 free((char*)param);
00158 return OBJcallreflex(m, 0);
00159 }
00160
00161
00174 int SO3CbLogs (mmachine m)
00175 {
00176 #ifdef SO3_DEBUG
00177 MMechostr(MSKDEBUG, "SO3CbSceneLog\n");
00178 #endif
00179
00180 int flag = MMpull(m);
00181 int p = MMpull(m);
00182 int reflex = MMpull(m);
00183 int chan = MMget(m, 0);
00184
00185 if(chan==NIL)
00186 {
00187 MMset(m, 0, NIL);
00188 return 0;
00189 }
00190
00191 if (SRoot::getSingletonPtr() == 0)
00192 {
00193 MMset(m, 0, NIL);
00194 return 0;
00195 }
00196
00197 int n = OBJfindTH(m, SO3LOGS, (int)(SRoot::getSingletonPtr()));
00198 if(n!=NIL)
00199 {
00200 n = MMfetch(m, n, OFFOBJMAG);
00201
00202 MMpull(m);
00203 MMpush(m, n);
00204 }
00205 else
00206 {
00207 int so3logobj = MMmalloc(m, 1, TYPETAB);
00208 if (so3logobj==NIL)
00209 {
00210 return MERRMEM;
00211 }
00212
00213 MMstore(m, so3logobj, 0, (int)SRoot::getSingletonPtr());
00214 MMpush(m, PTOM(so3logobj));
00215 OBJcreate(m, SO3LOGS, (int)SRoot::getSingletonPtr(), NIL, NIL);
00216 }
00217
00218
00219 Ogre::LoggingLevel logFlag = Ogre::LL_NORMAL;
00220 if (flag != NIL)
00221 logFlag = (Ogre::LoggingLevel)MTOI(flag);
00222
00223 SRoot::getSingleton().SetLogMask(logFlag);
00224 SRoot::getSingleton().SetLogEnable(reflex == NIL ? false : true);
00225
00226 MMpush(m, reflex);
00227 MMpush(m, p);
00228
00229 OBJaddreflex (m, SO3LOGS, SO3_LOGS_CB);
00230
00231 MMset(m, 0, ITOM(1));
00232
00233 return 0;
00234 }
00235
00236
00240 #define NBLOGSPKG 2
00241
00242
00246 char* LOGSname[NBLOGSPKG]=
00247 {
00248 "SO3Logs",
00249 "SO3CbLogs"
00250 };
00251
00252
00256 int (*LOGSFunc[NBLOGSPKG])(mmachine m)=
00257 {
00258 NULL,
00259 SO3CbLogs
00260
00261 };
00262
00263
00267 int LOGSnarg [NBLOGSPKG]=
00268 {
00269 TYPTYPE,
00270 4
00271
00272 };
00273
00274
00278 char* LOGSType[NBLOGSPKG]=
00279 {
00280 NULL,
00281 "fun [Chn fun [S u0] u1 u0 I] I"
00282
00283 };
00284
00285
00291 int SCOLloadLogs(mmachine m,cbmachine w)
00292 {
00293 scolLogEventsListener = new ScolLogEventsListener(SRoot::getSingleton().GetRootWindowHandle());
00294 SRoot::getSingleton().AddLogListener(scolLogEventsListener);
00295
00296 SO3LOGS = OBJregister(1, 1, destroyLogs, "SO3_LOGS");
00297
00298 SO3_LOGS_MSG = OBJgetUserEvent();
00299 OBJdefEvent(SO3_LOGS_MSG, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getLogCallback);
00300 return PKhardpak(m, "SO3Logs", NBLOGSPKG, LOGSname, LOGSFunc, LOGSnarg, LOGSType);
00301 }
00302
00303
00308 int SCOLfreeLogs()
00309 {
00310 SRoot::getSingleton().RemoveLogListener(scolLogEventsListener);
00311 SAFE_DELETE(scolLogEventsListener);
00312 return 0;
00313 }