+static void VM_M_crypto_getkeyfp(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ char keyfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getkeyfp);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, keyfp, sizeof(keyfp), NULL, 0, NULL, NULL))
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, keyfp );
+ else
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+}
+static void VM_M_crypto_getidfp(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ char idfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getidfp);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, idfp, sizeof(idfp), NULL, NULL))
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, idfp );
+ else
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+}
+static void VM_M_crypto_getidstatus(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ qbool issigned;
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getidstatus);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, NULL, &issigned))
+ PRVM_G_FLOAT( OFS_RETURN ) = issigned ? 2 : 1;
+ else
+ PRVM_G_FLOAT( OFS_RETURN ) = 0;
+}
+static void VM_M_crypto_getencryptlevel(prvm_prog_t *prog)
+{
+ lhnetaddress_t addr;
+ const char *s;
+ int aeslevel;
+ char vabuf[1024];
+
+ VM_SAFEPARMCOUNT(1,VM_M_crypto_getencryptlevel);
+
+ s = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString( prog, s );
+
+ if(LHNETADDRESS_FromString(&addr, s, 26000) && Crypto_RetrieveHostKey(&addr, NULL, NULL, 0, NULL, 0, &aeslevel, NULL))
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, aeslevel ? va(vabuf, sizeof(vabuf), "%d AES128", aeslevel) : "0");
+ else
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+}
+static void VM_M_crypto_getmykeyfp(prvm_prog_t *prog)
+{
+ int i;
+ char keyfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1, VM_M_crypto_getmykeyfp);
+
+ i = PRVM_G_FLOAT( OFS_PARM0 );
+ switch(Crypto_RetrieveLocalKey(i, keyfp, sizeof(keyfp), NULL, 0, NULL))
+ {
+ case -1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "");
+ break;
+ case 0:
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+ break;
+ default:
+ case 1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, keyfp);
+ break;
+ }
+}
+static void VM_M_crypto_getmyidfp(prvm_prog_t *prog)
+{
+ int i;
+ char idfp[FP64_SIZE + 1];
+
+ VM_SAFEPARMCOUNT(1, VM_M_crypto_getmyidfp);
+
+ i = PRVM_G_FLOAT( OFS_PARM0 );
+ switch(Crypto_RetrieveLocalKey(i, NULL, 0, idfp, sizeof(idfp), NULL))
+ {
+ case -1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, "");
+ break;
+ case 0:
+ PRVM_G_INT( OFS_RETURN ) = OFS_NULL;
+ break;
+ default:
+ case 1:
+ PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString(prog, idfp);
+ break;
+ }
+}
+static void VM_M_crypto_getmyidstatus(prvm_prog_t *prog)
+{
+ int i;
+ qbool issigned;
+
+ VM_SAFEPARMCOUNT(1, VM_M_crypto_getmyidstatus);
+
+ i = PRVM_G_FLOAT( OFS_PARM0 );
+ switch(Crypto_RetrieveLocalKey(i, NULL, 0, NULL, 0, &issigned))
+ {
+ case -1:
+ PRVM_G_FLOAT( OFS_RETURN ) = 0; // have no ID there
+ break;
+ case 0:
+ PRVM_G_FLOAT( OFS_RETURN ) = -1; // out of range
+ break;
+ default:
+ case 1:
+ PRVM_G_FLOAT( OFS_RETURN ) = issigned ? 2 : 1;
+ break;
+ }
+}
+
+// CL_Video interface functions
+
+/*
+========================
+VM_cin_open
+
+float cin_open(string file, string name)
+========================
+*/
+void VM_cin_open(prvm_prog_t *prog)
+{
+ const char *file;
+ const char *name;
+
+ VM_SAFEPARMCOUNT( 2, VM_cin_open );
+
+ file = PRVM_G_STRING( OFS_PARM0 );
+ name = PRVM_G_STRING( OFS_PARM1 );
+
+ VM_CheckEmptyString(prog, file );
+ VM_CheckEmptyString(prog, name );
+
+ if( CL_OpenVideo( file, name, MENUOWNER, "" ) )
+ PRVM_G_FLOAT( OFS_RETURN ) = 1;
+ else
+ PRVM_G_FLOAT( OFS_RETURN ) = 0;
+}
+
+/*
+========================
+VM_cin_close
+
+void cin_close(string name)
+========================
+*/
+void VM_cin_close(prvm_prog_t *prog)
+{
+ const char *name;
+
+ VM_SAFEPARMCOUNT( 1, VM_cin_close );
+
+ name = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString(prog, name );
+
+ CL_CloseVideo( CL_GetVideoByName( name ) );
+}
+
+/*
+========================
+VM_cin_setstate
+void cin_setstate(string name, float type)
+========================
+*/
+void VM_cin_setstate(prvm_prog_t *prog)
+{
+ const char *name;
+ clvideostate_t state;
+ clvideo_t *video;
+
+ VM_SAFEPARMCOUNT( 2, VM_cin_setstate );
+
+ name = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString(prog, name );
+
+ state = (clvideostate_t)((int)PRVM_G_FLOAT( OFS_PARM1 ));
+
+ video = CL_GetVideoByName( name );
+ if( video && state > CLVIDEO_UNUSED && state < CLVIDEO_STATECOUNT )
+ CL_SetVideoState( video, state );
+}
+
+/*
+========================
+VM_cin_getstate
+
+float cin_getstate(string name)
+========================
+*/
+void VM_cin_getstate(prvm_prog_t *prog)
+{
+ const char *name;
+ clvideo_t *video;
+
+ VM_SAFEPARMCOUNT( 1, VM_cin_getstate );
+
+ name = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString(prog, name );
+
+ video = CL_GetVideoByName( name );
+ if( video )
+ PRVM_G_FLOAT( OFS_RETURN ) = (int)video->state;
+ else
+ PRVM_G_FLOAT( OFS_RETURN ) = 0;
+}
+
+/*
+========================
+VM_cin_restart
+
+void cin_restart(string name)
+========================
+*/
+void VM_cin_restart(prvm_prog_t *prog)
+{
+ const char *name;
+ clvideo_t *video;
+
+ VM_SAFEPARMCOUNT( 1, VM_cin_restart );
+
+ name = PRVM_G_STRING( OFS_PARM0 );
+ VM_CheckEmptyString(prog, name );
+
+ video = CL_GetVideoByName( name );
+ if( video )
+ CL_RestartVideo( video );
+}
+
+static void VM_M_registercommand(prvm_prog_t *prog)