void EventHandler_UPnPEvent(object e, UPnPEventArgs args, CallBack callBack)
 {
     ActionEvent(e, args, callBack);
 }
 void _sourceDevice_ActionEvent(object e, UPnPEventArgs args, CallBack cb)
 {
     Console.WriteLine("DB Handle Action: " + args.Action);
     if(args.Action == "Browse")
     {
         IDBStrategy strat = _strategies[args.Action];
         strat.Handle(args.Args, cb, _dbXmlWriter);
     }
 }
 static void u_ActionEvent(object e, UPnPEventArgs args, CallBack cb)
 {
     //cb()
 }
        private void UPnPHandler(object e, UPnPEventArgs args, CallBack cb)
        {
            string action = args.Action;
            List<UPnPArg> returnVal = args.Args;

            switch (args.Action)
            {
                case "Play":
                    Play();
                    returnVal = null;
                    break;

                case "Next":
                    Next();
                    returnVal = null;
                    break;

                case "Prev":
                    Prev();
                    returnVal = null;
                    break;

                case "Pause":
                    Pause();
                    returnVal = null;
                    break;

                case "SetNextAVTransportURI":
                    AddToPlayQueue(ref returnVal);
                    returnVal = null;
                    break;

                case "SetAVTransportURI":
                    SetCurrentURI(ref returnVal);
                    returnVal = null;
                    break;

                //case "AddAt":
                //    AddToPlayQueue(ref returnVal); //Also needs an int, index. Is it contained in returnVal?
                //    returnVal = null;
                //    break;

                case "PlayAt":
                    PlayAt(ref returnVal);
                    returnVal = null;
                    break;

                case "Remove":
                    RemoveFromPlayQueue(ref returnVal);
                    returnVal = null;
                    break;

                case "SetVol":
                    SetVol(ref returnVal);
                    returnVal = null;
                    break;

                case "SetPos":
                    SetPos(ref returnVal);
                    break;

                case "GetVolume":
                    returnVal.Add(new UPnPArg("GetVol", GetVol().ToString())); //return the volume
                    break;

                case "GetPos":
                    returnVal.Add(new UPnPArg("GetPos", GetPos().ToString())); //return the position
                    break;

                default:
                    Console.WriteLine("PLaybackControl class switchcase default");
                    break;
            }

            Console.WriteLine("PlaybackCtrl ready for callback");
            cb(returnVal, args.Action);
        }
 /// <summary>
 /// Handler for ActionEvents.
 /// Reacts to ActionEvents and sees if data is valid.
 /// 
 /// If action is valid it is handled.
 /// </summary>
 /// <param name="e"></param>
 /// <param name="args"></param>
 /// <param name="cb"></param>
 void _sourceDevice_ActionEvent(object e, UPnPEventArgs args, CallBack cb)
 {
     if (args.Action == "Browse")
     {
         Console.WriteLine("DB Handle Action: " + args.Action);
         IDBStrategy strat = _strategies [args.Action];
         strat.Handle (args.Args, cb, _dbXmlWriter, _PQHandler);
     }
     else if (args.Action == "GetIPAddress")
     {
         Console.WriteLine ("GetIPAddress");
         HandleGetIP(cb);
     }
 }
        /// <summary>
        /// Called whenever an UPnP event is received, reads the Action argument and responds appropriately
        /// </summary>
        /// <param name="e">Unused param to comply with standard</param>
        /// <param name="args">UPnPEventArgs containing desired action and params for the action</param>
        /// <param name="cb">Callback function to call at end of function</param>
        private void UPnPHandler(object e, UPnPEventArgs args, CallBack cb)
        {
            string action = args.Action;
            bool CallCB = true;
            List<UPnPArg> returnVal = args.Args;

            if (action != "Browse")
            {
                Console.WriteLine (" >> Command called: " + args.Action);
                switch (args.Action)
                {
                case "Play":
                    Play();
                    returnVal = null;
                    break;

                case "Next":
                    Next();
                    returnVal = null;
                    break;

                case "Previous":
                    Prev();
                    returnVal = null;
                    break;

                case "Pause":
                    Pause();
                    returnVal = null;
                    break;

                case "SetNextAVTransportURI":
                    AddToPlayQueue(ref returnVal);
                    returnVal = null;
                    break;

                case "SetAVTransportURI":
                    SetCurrentURI(ref returnVal);
                    returnVal = null;
                    break;

                case "Remove":
                    RemoveFromPlayQueue(ref returnVal);
                    returnVal = null;
                    break;

                case "SetVolume":
                    SetVol(ref returnVal);
                    returnVal = null;
                    break;

                case "SetPosition":
                    SetPos(ref returnVal);
                    returnVal = null;
                    break;

                case "GetVolume":
                    string  vol = GetVol();
                    returnVal = new List<UPnPArg>(){new UPnPArg("CurrentVolume", vol)};
                    break;

                case "GetPosition":
                   	returnVal = CreatePosArgs();
                    break;

                case "GetCurrentTrack":
                    returnVal = GetCurrentTrackArgs();
                    break;

                case "GetIPAddress":
                    CallCB = false;
                    break;

                default:
                    Console.WriteLine("PlaybackControl class switchcase default");
                    break;
                }

            if(CallCB)
            {
                cb(returnVal, args.Action);
            }
            }
        }