示例#1
0
        private Album CloneAlbum(Database db, Album pl)
        {
            Album clone_pl = new Album(pl.Name);

            clone_pl.Id = pl.Id;

            IList <Photo> plphotos = pl.Photos;

            for (int i = 0; i < plphotos.Count; i++)
            {
                clone_pl.AddPhoto(db.LookupPhotoById(plphotos [i].Id), pl.GetContainerId(i));
            }

            return(clone_pl);
        }
示例#2
0
        internal static void FromAlbumNode(Database db, ContentNode node, out Photo photo, out int containerId)
        {
            photo       = null;
            containerId = 0;

            foreach (ContentNode field in (ContentNode [])node.Value)
            {
                switch (field.Name)
                {
                case "dmap.itemid":
                    photo = db.LookupPhotoById((int)field.Value);
                    break;

                case "dmap.containeritemid":
                    containerId = (int)field.Value;
                    break;

                default:
                    break;
                }
            }
        }
示例#3
0
        internal bool OnHandleRequest(Socket client, string username, string path, NameValueCollection query, int range)
        {
            string photoQuery;

            if (query ["query"] != null)
            {
                photoQuery = query ["query"];
            }
            else
            {
                photoQuery = "";
            }

            int session = 0;

            if (query ["session-id"] != null)
            {
                session = Int32.Parse(query ["session-id"]);
            }

/*            if (!sessions.ContainsKey (session) && path != "/server-info" && path != "/content-codes" &&
 *              path != "/login") {
 *              ws.WriteResponse (client, HttpStatusCode.Forbidden, "invalid session id");
 *              return true;
 *          }
 */
            if (session != 0)
            {
                sessions [session].LastActionTime = DateTime.Now;
            }

            int clientRev = 0;

            if (query ["revision-number"] != null)
            {
                clientRev = Int32.Parse(query ["revision-number"]);
            }

            int delta = 0;

            if (query ["delta"] != null)
            {
                delta = Int32.Parse(query ["delta"]);
            }
            // DEBUG data
            Console.WriteLine("Before returning resources for path " + path + ", meta " + query ["meta"] + " query " + photoQuery);
            if (dbItemsRegex.IsMatch(path))              //&& photoQuery.Length==0
            {
                Console.WriteLine("\tThis is a database/items request!");
            }

            if (path == "/server-info")
            {
                ws.WriteResponse(client, GetServerInfoNode());
            }
            else if (path == "/content-codes")
            {
                ws.WriteResponse(client, ContentCodeBag.Default.ToNode());
            }
            else if (path == "/login")
            {
                ExpireSessions();

                if (maxUsers > 0 && sessions.Count + 1 > maxUsers)
                {
                    ws.WriteResponse(client, HttpStatusCode.ServiceUnavailable, "too many users");
                    return(true);
                }

                session = random.Next();
                User user = new User(DateTime.Now, (client.RemoteEndPoint as IPEndPoint).Address, username);

                lock (sessions) {
                    sessions [session] = user;
                }

                ws.WriteResponse(client, GetLoginNode(session));
                OnUserLogin(user);
            }
            else if (path == "/logout")
            {
                Console.WriteLine("logout!");
                User user = sessions [session];

                lock (sessions) {
                    sessions.Remove(session);
                }

                ws.WriteResponse(client, HttpStatusCode.OK, new byte [0]);
                OnUserLogout(user);

                return(false);
            }
            else if (path == "/databases")
            {
                Console.WriteLine("path==/databases");
                ws.WriteResponse(client, GetDatabasesNode());
            }
            else if (dbItemsRegex.IsMatch(path) && photoQuery.Length == 0)    //&& !dbPhotoRegex.IsMatch (query ["query"])) {
            {
                Console.WriteLine("dbItemsRegex, query=" + query ["query"] + " meta=" + query ["meta"]);
                int dbid = Int32.Parse(dbItemsRegex.Match(path).Groups [1].Value);

                Database curdb = revmgr.GetDatabase(clientRev, dbid);

                if (curdb == null)
                {
                    ws.WriteResponse(client, HttpStatusCode.BadRequest, "invalid database id");
                    return(true);
                }

                ArrayList deletedIds = new ArrayList();

                if (delta > 0)
                {
                    Database olddb = revmgr.GetDatabase(clientRev - delta, dbid);

                    if (olddb != null)
                    {
                        foreach (Photo photo in olddb.Photos)
                        {
                            if (curdb.LookupPhotoById(photo.Id) == null)
                            {
                                deletedIds.Add(photo.Id);
                            }
                        }
                    }
                }

                ContentNode node = curdb.ToPhotosNode(query ["meta"].Split(','),
                                                      (int [])deletedIds.ToArray(typeof(int)));
                ws.WriteResponse(client, node);
            }
            else if (dbPhotoRegex.IsMatch(photoQuery))
            {
                Console.WriteLine("dbPhotoRegex");
                Console.WriteLine("dbPhotosRegex, query=" + query ["query"] + " meta=" + query ["meta"]);
                string [] photoIds = query ["query"].Split(',');
                Match     match    = dbPhotoRegex0.Match(path);
                int       dbid     = Int32.Parse(match.Groups [1].Value);
                int       photoid  = 0;


                //match = dbPhotoRegex.Match (photoQuery);

                Database db = revmgr.GetDatabase(clientRev, dbid);
                if (db == null)
                {
                    ws.WriteResponse(client, HttpStatusCode.BadRequest, "invalid database id");
                    return(true);
                }
                ArrayList photoNodes = new ArrayList();
                Photo     photo      = db.LookupPhotoById(1);

                foreach (string photoId in photoIds)
                {
                    match   = dbPhotoRegex.Match(photoId);
                    photoid = Int32.Parse(match.Groups [1].Value);
                    photo   = db.LookupPhotoById(photoid);
                    photoNodes.Add(photo.ToFileData(query ["meta"].Contains("dpap.thumb")));
                    // DEBUG
                    //Console.WriteLine ("Requested photo id=" + photoid);
                }

                ArrayList children = new ArrayList();
                children.Add(new ContentNode("dmap.status", 200));
                children.Add(new ContentNode("dmap.updatetype", (byte)0));
                children.Add(new ContentNode("dmap.specifiedtotalcount", 2));
                children.Add(new ContentNode("dmap.returnedcount", 2));
                children.Add(new ContentNode("dmap.listing", photoNodes));
                ContentNode dbsongs = new ContentNode("dpap.databasesongs", children);

                if (photo == null)
                {
                    ws.WriteResponse(client, HttpStatusCode.BadRequest, "invalid photo id");
                    return(true);
                }

                try {
                    try {
                        if (PhotoRequested != null)
                        {
                            PhotoRequested(this, new PhotoRequestedArgs(username,
                                                                        (client.RemoteEndPoint as IPEndPoint).Address,
                                                                        db, photo));
                        }
                    } catch {}

                    if (photo.FileName != null)
                    {
                        // DEBUG
                        //Console.WriteLine ("photo.Filename != null" + query ["meta"].Split (',') [0]);
                        //ContentNode node = photo.ToFileData ();
                        //node.Dump ();

                        ws.WriteResponse(client, dbsongs);
                    }
                    else if (db.Client != null)
                    {
                        Console.WriteLine("db.Client != null");
                        long   photoLength = 0;
                        Stream photoStream = db.StreamPhoto(photo, out photoLength);

                        try {
                            ws.WriteResponseStream(client, photoStream, photoLength);
                        } catch (IOException) {
                            Console.WriteLine("IOException!");
                        }
                    }
                    else
                    {
                        Console.WriteLine("Else - internal error");
                        ws.WriteResponse(client, HttpStatusCode.InternalServerError, "no file");
                    }
                } finally {
                    // commented out because it breaks the connection after sending a hires photo
                    // client.Close()
                }
            }
            else if (dbContainersRegex.IsMatch(path))
            {
                int dbid = Int32.Parse(dbContainersRegex.Match(path).Groups [1].Value);

                Database db = revmgr.GetDatabase(clientRev, dbid);
                if (db == null)
                {
                    ws.WriteResponse(client, HttpStatusCode.BadRequest, "invalid database id");
                    return(true);
                }

                ws.WriteResponse(client, db.ToAlbumsNode());
            }
            else if (dbContainerItemsRegex.IsMatch(path))
            {
                // DEBUG
                Console.WriteLine("ContainerItems ! path=" + path);

                Match match = dbContainerItemsRegex.Match(path);
                int   dbid  = Int32.Parse(match.Groups [1].Value);
                int   plid  = Int32.Parse(match.Groups [2].Value);

                Database curdb = revmgr.GetDatabase(clientRev, dbid);
                if (curdb == null)
                {
                    ws.WriteResponse(client, HttpStatusCode.BadRequest, "invalid database id");
                    return(true);
                }

                Album curpl = curdb.LookupAlbumById(plid);
                if (curdb == null)
                {
                    ws.WriteResponse(client, HttpStatusCode.BadRequest, "invalid playlist id");
                    return(true);
                }
                // DEBUG
                Console.WriteLine("db and album ready!");
                ArrayList deletedIds = new ArrayList();
                if (delta > 0)
                {
                    Database olddb = revmgr.GetDatabase(clientRev - delta, dbid);

                    if (olddb != null)
                    {
                        Album oldpl = olddb.LookupAlbumById(plid);

                        if (oldpl != null)
                        {
                            IList <Photo> oldplPhotos = oldpl.Photos;
                            for (int i = 0; i < oldplPhotos.Count; i++)
                            {
                                int id = oldpl.GetContainerId(i);
                                if (curpl.LookupIndexByContainerId(id) < 0)
                                {
                                    deletedIds.Add(id);
                                }
                            }
                        }
                    }
                }
                Console.WriteLine("About to send response... meta=" + query["meta"]);
                curpl.ToPhotosNode(query ["meta"].Split(',')).Dump();

                ws.WriteResponse(client, curpl.ToPhotosNode(query ["meta"].Split(',')));
                //, (int []) deletedIds.ToArray (typeof (int))));
            }
            else if (path == "/update")
            {
                int retrev;

                lock (revmgr) {
                    // if they have the current revision, wait for a change
                    if (clientRev == revmgr.Current)
                    {
                        Monitor.Wait(revmgr);
                    }

                    retrev = revmgr.Current;
                }

                if (!running)
                {
                    ws.WriteResponse(client, HttpStatusCode.NotFound, "server has been stopped");
                }
                else
                {
                    ws.WriteResponse(client, GetUpdateNode(retrev));
                }
            }
            else
            {
                ws.WriteResponse(client, HttpStatusCode.Forbidden, "GO AWAY");
            }

            return(true);
        }
        private Album CloneAlbum(Database db, Album pl)
        {
            Album clone_pl = new Album (pl.Name);
            clone_pl.Id = pl.Id;

            IList<Photo> plphotos = pl.Photos;
            for (int i = 0; i < plphotos.Count; i++) {
                clone_pl.AddPhoto (db.LookupPhotoById (plphotos [i].Id), pl.GetContainerId (i));
            }

            return clone_pl;
        }