• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples

/home/dko/projects/mobilec/tags/MobileC-v1.10.4/src/win32/LibMC.net/LibMC/MCAgent.cs

Go to the documentation of this file.
00001 using System;
00002 using System.Collections.Generic;
00003 using System.Text;
00004 using System.Runtime.InteropServices;
00005 
00050 namespace LibMC
00051 {
00061     public class MCAgent
00062     {
00063         private IntPtr agent_p;
00064         private String name = "";
00065         private int id = -1;
00066         private int numTasks = -1;
00067         private MC_AgentStatus_e status = MC_AgentStatus_e.MC_NO_STATUS;
00068         private MC_AgentType_e type = MC_AgentType_e.MiȏC8qCqZg&eA@)2'}ۍSoyO3g%۴na^"g-Mb<ڤq!Uy:u䅸2„G1#ȋ/	Ăr#pOv:tu#Ex%Wa%pFx?G̫E
&+eB[[y渴I2a!AWӡJ-0tl	H1 [jtw	S
OOmBSܡ<39Ym5{KHx\!̈́{'O
Vf*
Ӂ*	@ 쫨[g;
&+TWvD>IsM}IXn8־x}>P7^3.z{
o\XjW޸yN$3usOpԷ}oQ5SYP3ܯ
G
܈eqm=&:QkR56břk'Э1HcAfm_%k")oBUy#(?)r۠1qU@67/=;)yP~3(+7<
RI3~zpՅv\m3(OI=]bs=KٱBG{4.nT\\#zjN'/ecgi]IYO]\eSxBZ7
bۦ]..ӓ47l_LrWxRO<ĔE̮뱬MaɟcTs|U)Y!zrb^7,r*P{XV9P>m<%[Tt6tw TO*U~LDv2*~1sϘlRH6"-0Q"g${H<{[zqD iK8óS@n$ڑ8fAWmOȎq{Ak%74VouRE,-t1Q(է7KfGJNUғ고wρNJ._ð	fwQٰ5]yxƢLqkYD	o[ɛ"1D]I뱵|{kQ~l mRfj<$dm%CDAHqS7: dVҷWz$sQcHǺˀS0iWHq^FXxw3,-߹}@l,nŨ$8qgl	x#*L`9qQםS
nÃt~:6rgd1$:-#7t|TX3})=fԩ>}
 cXFm%S!؏Ȕ,DHG~xgE*\#`f,(+w021ynt;AUx"ge?٩jw	 j>J2pHZܵ$
et`4H)pYYmXCvzsovҝ4I78 \l"R6Zr:r!QkAY#Hȁ"פKP{;:d1{sxL?BpPe-_~3'sֱ9t	şv2(aZih͕=Jx|U㊕rt-셍~8AX8'[ҹ
BgKolVv
2mbÝT(a
NH

Na?n
zZ7sZbnΝ2AtaCWMpc΂T>Ltx#ɗҝ4&ikeC;(@"\g9P;^u_1}MK@j 2Mp:0%5@peɛWv	7g(6H`w$sS?/M%:u?a
fak:[)আ hIR.-t۾(~ɱEQb?<4>*34[;SEc8{8-ِEF&a[Qq;JMNkq	V<d7vI|c*%WPAwфm[EtX{`ߥ83	ec!lٍͲbI&"
L<זhW ]kOJ̆춝]Ah*CA|s
	39	֫Uȴ:TJ"IS8BXI	^/>Zv3%_Y_?ܿJ/H9Ӳc`wUzݷC0xz`FI$n|
W>mB,!&pI:{
tJ^/xsF.,~#vz
6D+{J~ڙLχ+}!mzJAa?public MCAgent()
00105         {
00106             // Not using wrapper - default value
00107             agent_p = IntPtr.Zero;
00108         }
00109 
00110         internal MCAgent(IntPtr ip)
00111         {
00112             Agent = ip;
00113         }
00114 
00126         public override string ToString()
00127         {
00128             StringBuilder sb = new StringBuilder();
00129             sb.AppendFormat("MCAgent:\n\tName: {0}\n\tID: {1}\n\tNumTasks: {2}\n\tStatus: {3}\n\tType: {4}", 
00130                 AgentName.ToString(), 
00131                 AgentID.ToString(),
00132                 AgentNumTasks.ToString(),
00133                 Enum.GetName(typeof(MC_AgentStatus_e), AgentStatus),
00134                 Enum.GetName(typeof(MC_AgentType_e), AgentType));
00135 
00136             return sb.ToString();
00137         }
00138 
00139         /*
00140          * Accessors
00141          */
00142         internal IntPtr Agent
00143         {
00144             get
00145             {
00146                 if (agent_p == IntPtr.Zero)
00147                     throw new InvalidAgentException();
00148                 else
00149                     return agent_p;
00150             }
00151             set
00152             {
00153                 if (agent_p == IntPtr.Zero)
00154                 {
00155                     agent_p = value;
00156                     GetAgentFields();
00157                 }
00158                 else
00159                     throw new InvalidAgentException("Attempting to assign new agent to non-zero agent pointer!");
00160             }
00161         }
00162 
00163         private void GetAgentFields()
00164         {
00165             id = MCAgency._MC_GetAgentID(Agent);
00166             name = MCAgency._MC_GetAgentName(Agent);
00167             numTasks = MCAgency._MC_GetAgentNumTasks(Agent);
00168             status = MCAgency._MC_GetAgentStatus(Agent);
00169             type = MCAgency._MC_GetAgentType(Agent);
00170         }
00171 
00180         public int AgentID
00181      řyʣQʉI`cX,ˏu,+K--5eghfKTk5[ba'NY'swc	Y¹*-ek&דu5rh_0!8蜫TT)tf5C6H}V6Sno"fje.VκԪjj*UUZrMߦM.ѦiI\q#+z_=WZ+J467A7F7

L~o
{;>l+.H8pn9g4v^|(WZ%|ksZ^Zvun-h[Eseqox4g.Y?=3>[>*	ʂ`>΄g3~Uq)⚀T6Oo:J
Z
UKULvS6*ꬒjxjk;œfKWTj"Go6o7TOM=9a9MN@wsEbZó,`ZZl[kB0V¼Yfs~[SAʵfΐ]-&[uVK껸ڬ᭨pMh1Uf3c=ikűo-rs9NX&*;kqujԲi8ꝲK0
7R!g󅷓%\dfCSUb]xVOUc[VxVqܸն֫jY5k+}_ڋ	᛻V;xu*2sŎcXzT{^l,w|NڎgN\|o[\cE8/D"YN>N{镋LS-3a2wTQa|UnuZ1ףRI0G<dkV55ۚWnMFVS^C2G5rt=&lB_-W[yuW^uUwA~[^Ltz#ImC&f{SqHac,8YnoS8rwS/P-,Pb
Xٝ؎Gm^O+o9\yaß0PakW9/4o+wٝw=S)ٳU,V\2~k/f˩L8צ|WݍuaU^sO&	QsS
3
KzͣQU	z`nDyWw]VϬ.@Vg6'^Jeeg&Ee|vF8yw/Ϸ)|)VahltYx9$Jݧzr2̶gZݜ$gg5wu⡛8(nMbkp'9e?2rNZ3ד^I4MiI|k%A?<tB
gAΫ4F$JX©,齂1@
gI=Jz,%KHV$ p8\_,1jĬAuS8.[R*63|
#R%UZi1<*]b:I	DP41T+$`4HX*~/{_	D<R="R3=
)SəAՋ:f
YrVŀP"78ԉR.]B%S7(qn}UbFz<Gs{)2.ecͤj%Hwro08q ])xEţ Kwwl*!%80@TU`@tq^̟ф@/)*Eɷ0 2/'%: 
mdFttۜV>^yb ECX?MK~?cU-dL1gmYΨC±X2GT	EpqC
"T_*pWHFsɁg YǬn„O/5oK'B`jXR1.,q-D%wՄŕN]avUzQnj
8[#JůwTYh
b"kxdIԾ,Ywe,sh!rp@	\,Yo1vb3jӡ1kȆ0nAߢC'h(F)hKC$g%K'(<ȉ[lHnL7;0wXoa5O[𳘾"B9mNihE,UIEHr$\5
k]Ty :t#gryP%ldbd.ȗmfV
0ش)ƁcBL>sAyl[4s[Nג֮qNRlM]XyIv%n&n H52~4)/yeg$̩J9:KIG׷ol/[E()>&"B8n(Zᰉ>00249             {
00250                 MCAgency._MC_SetAgentStatus(Agent, value);
00251                 status = MCAgency._MC_GetAgentStatus(Agent);
00252             }
00253         }
00254 
00263         public MC_AgentType_e AgentType
00264         {
00265             get
00266             {
00267                 return type;
00268             }
00269             /*set
00270             {
00271                 type = value;
00272             }*/
00273         }
00274 
00284         public bool Valid
00285         {
00286             get
00287             {
00288                 return (agent_p != IntPtr.Zero);
00289             }
00290             /*set
00291             {
00292                 type = value;
00293             }*/
00294         }
00295 
00296         /*
00297          * Static casting operators
00298          */
00299         static public implicit operator IntPtr(MCAgent agent)
00300         {
00301             return agent.Agent;
00302         }
00303 
00304         static public implicit operator MCAgent(IntPtr ip)
00305         {
00306             return new MCAgent(ip);
00307         }
00308 
00309         /*
00310          * Agent functions
00311          */
00312 
00321         public int DeleteAgent()
00322         {
00323             return MCAgency._MC_DeleteAgent(Agent);
00324         }
00325 
00334         public String GetAgentXMLString()
00335         {
00336             return MCAgency._MC_GetAgentXMLString(Agent);
00337         }
00338 
00347         public int PrintAgentCode()
00348         {
00349             return MCAgency._MC_PrintAgentCode(Agent);
00350         }
00351 
00359         public String RetrieveAgentCode()
00360         {
00361             return MCAgency._MC_RetrieveAgentCode(Agent);
00362         }
00363 
00372         public int TerminateAgent()
00373         {
00374             return MCAgency._MC_TerminateAgent(Agent);
00375         }
00376 
00377         /*public int _MC_CallAgentFunc(IntPtr agent, String funcName, void* returnVal, void* varg);*/
00378         /*public void* _MC_GetAgentExecEngine(IntPtr agent);*/
00379         /*public int _MC_GetAgentReturnData(IntPtr agent, int task_num, void **data, int *dim, int **extent);*/
00380 
00381         /*
00382          * ACL Functions
00383          */
00384 
00397         public int AclPost(MCAclMessage message)
00398         {
00399             return MCAgency._MC_AclPost(Agent, message.AclMsg);
00400         }
00401 
00413         public MCAclMessage AclRetrieve()
00414         {
00415             IntPtr temp = MCAgency._MC_AclRetrieve(Agent);
00416             if (temp == IntPtr.Zero)
00417                 return new MCAclMessage();
00418             else
00419                 return new MCAclMessage(temp);
00420         }
00421 
00432         public MCAclMessage AclWaitRetrieve()
00433         {
00434             IntPtr temp = MCAgency._MC_AclWaitRetrieve(Agent);
00435             if (temp == IntPtr.Zero)
00436                 return new MCAclMessage();
00437             else
00438                 return new MCAclMessage(temp);
00439         }
00440 
00458         public int CallAgentFunc(String funcName, IntPtr retval, IntPtr varg)
00459         {
00460             return MCAgency._MC_CallAgentFunc(Agent, funcName, retval, varg);
00461         }
00462 
00488         public int CallAgentFunc(String funcName, ref object retval, ref object varg)
00489         {
00490             int temp = -1;
00491             IntPtr vargp = IntPtr.Zero, retvalp = IntPtr.Zero;
00492             try
00493             {
00494                 vargp = Marshal.AllocHGlobal(Marshal.SizeOf(varg));
00495                 Marshal.StructureToPtr(varg, vargp, false);
00496                 retvalp = Marshal.AllocHGlobal(Marshal.SizeOf(retval));
00497 
00498                 temp = CallAgentFunc(funcName, // The function to call
00499                     retvalp, // A place for the return value (void*)
00500                     vargp);  // The marshaled pointer to the argument (a structure)
00501                 retval = Marshal.PtrToStructure(retvalp, retval.GetType());
00502                 varg = Marshal.PtrToStructure(vargp, varg.GetType());
00503             }
00504             catch (OutOfMemoryException ex)
00505             {
00506                 Console.WriteLine("Error allocating memory for calling agent functions: " + ex.Message);
00507             }
00508             catch (ArgumentException ex)
00509             {
00510                 Console.WriteLine("Error marshaling arguments for calling agent functions: " + ex.Message);
00511             }
00512             finally
00513             {
00514                 Marshal.FreeHGlobal(vargp);
00515                 Marshal.FreeHGlobal(retvalp);
00516             }
00517 
00518             return temp;
00519         }
00520 
00533         public IntPtr GetAgentExecEngine()
00534         {
00535             return MCAgency._MC_GetAgentExecEngine(Agent);
00536         }
00537 
00554         public int GetAgentReturnData(int task_num, IntPtr data, IntPtr dim, IntPtr extent)
00555         {
00556             //return _MC_GetAgentReturnData(IntPtr agent, int task_num, IntPtr data, IntPtr dim, IntPtr extent);
00557             throw new Exception("GetAgentReturnData is not yet implemented!");
00558         }
00559     }
00560 
00568     public class InvalidAgentException : SystemException
00569     {
00570         private const String msg = "Private agent pointer not valid.";
00571 
00579         public InvalidAgentException()
00580             : base(msg)
00581         {
00582         }
00583 
00590         public InvalidAgentException(String exc)
00591             : base(exc)
00592         {
00593         }
00594     }
00595 }